Excel VBA 質問スレ Part59
レス数が1000を超えています。これ以上書き込みはできません。
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part58
https://mevius.5ch.net/test/read.cgi/tech/1542577644/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured ただし、VBAが何かわからないような馬鹿はお断りです 他の言語スレでは相手にされずここならマウント取れるだろうとやって来る馬鹿もお断りです 前スレ終了直前でスルーされてしまった質問です。お願いします。
あるファイルに、
on error goto err
******
exit sub
err:
msgbox err.description
end sub
↑
こういうコードをたくさん書いてきました。
しかし、エラーが出たときに、どのプロシージャで発生したのか知りたくなり、
msgbox err.description & このプロシージャ名
に変更したくなりました。
「このプロシージャ名」を書く方法ってあるのでしょうか? C#で作成したライブリファイルをビルドしてtest.dllファイルを作成し仮にデスクトップに置きました。
中身は
public string[] GetData(string path,string file)
{
//処理
}
これをVBAで実行したのですが、標準モジュールでどう宣言したらできますか?
そもそも出来るんですか?
Declare Function strData Lib "???" Alias "???" () As string()
これを使うんですよね? そうやって作ったのって、やっぱ実行速度はC#並みになるのかな。
VBAレベルに落ちちゃうなら、VBAに翻訳しちゃうとか。 エクセルvba勉強始めてるんですけど
言語がなんかすきになれないです
オブジェクトを生成してそれを操作するってのばっかりにみえるんですが
それならいっそパイソンやら使いやすい言語でcomオブジェクトからエクセルを操作したほうがいいんでしょうか? 要望2だけ反映させてました
https://www.axfc.net/u/3958630
変更点
乱数はマイナスも作成できるようになりました
文字シャッフル機能を追加しました
ケンブリッジのあれも取り入れてみました
要望1はいいと言うことなのでこれで終わりたいと思います。
スレ汚し失礼しました。 >>5
無かったと思うな…
あるとしても ThisModuleな感じか… >>8
別の言語でエクセルの操作はおすすめできない
やるならワークブック/ワークシートオブジェクトなどを操作した方がいい
オブジェクトを操作するだけならわざわざ高いOfficeも買わなくていいし デバッグしてたらとまりませんね・・・
何個かバグつぶしたので上げなおします
https://www.axfc.net/u/3958695 なんかすみませんね。深夜睡眠をけずってまでやってらったようで、、。ツールありがとうございます。
あとはこちらでいただいたツールをベースに必要に応じてカスタマイズします。 JScriptでエクセルやってます
いろいろ出来るようになったのですが、VBAで選択した範囲の右下をとるときに、
y = Selection.Row + Selection.Rows.Count - 1
x = Selection.Column + Selection.Columns.Count - 1
としますが、JScripで、
var sheet = book.Worksheets( 1 );
var y = sheet.Selection.Row
とかしてもありませんと怒られます。どうしたらいいでしょうか
また、いろいろとググっているのですが、JScriptで使えるエクセル専用のオブジェクトやプロパティを
調べられるサイトってないのでしょうか。なかなか見つけられないのですがわかる方、教えてください
VBAならいろいろあるようですが >>14
JScriptは良くわからんが・・Javaは結構したけど
見当違いなら申し訳ないが
既にExcelが起動していて、シート1が選択され
範囲が選択されている状況で、JScriptを動かしているんで良いですよね >>5
単にプロシージャ名の変数を宣言しておき
各プロシージャ実行時にプロシージャ名に名前をセットして実行
エラー表示でプロシージャ名の変数を表示するだけでは >>14
var sheet = book.Worksheets(1);
sheet.Activate;
var selected = book.Application.Selection;
var x = selected.Row + selected.Rows.Count - 1;
var y = selected.Column + selected.Columns.Count - 1;
でいけるんじゃないかな
試してないから間違ってたらごめん >>8
昔は、メモリーの領域を分け合って使ってたけど
いまわ全てオブジェクトと思え
エクセルは色々このオブジェクトの使い方が説明されていて
機能も多い
いやならすべて作ればとなるが、所詮何も出来ないだろ >>17
これは間違いだな、サブルーチンから戻った時を考えてない
サブルーチンでは、元の名前を保存しておき元に戻す処理が必要になるが
こんなの今時やらないな したがって、プロシージャ名は配列で宣言し、サブルーチンの時の処理が必要になるが
これは、システムが管理しているのを使うべきだな、すまない >>18
ありがとうございます!
それで動きました。 どこでそういうのは調べるのでしょうか。 なかなかググってもわかりません
>>15
最初にJScriptを始めたとき、ネットでJScriptの方が初心者向けにエクセルの操作とかわかりやすい記述が
見つかったので、JScriptを始めたのですが、VBSだと、VBAとぼとんど同じプロパティで同じことができますか?
そうなら、VBSに移ろうかな まあなんだな、質問して回答を実行してできたことが答えじゃなくて
何故できなくて、何で出来たのが答えなんだけどな >>22
今回の質問はエクセルのオブジェクトモデルに忠実に従えば解決するものだよ
VBS含め他のどんな言語を選択しようが、そのあたりの事情は変わらない
具体的には、今回はSelectionへのアクセス方法がおかしかったわけで、
MSDNリファレンスのプロパティ一覧を見たり、VBEのオブジェクトブラウザでプロパティを検索したりすれば、
Worksheetオブジェクトには現在の選択範囲へのアクセスを提供するSelectionプロパティがないことや、
SelectionプロパティはApplicationオブジェクトのメンバとして実装されていることが分かる 前スレでもあったが、シートを選択してなければ、そのシートの選択範囲は取れない
ただそれだけだろ >>26
元の質問のサンプルはsheet.Selectionという式の構文が間違っているので、仮にシートを選択していようが選択範囲は取れない
あと、シート上のSelectionの情報を取るだけなら画面遷移を伴うSelectではなくActivateで十分だろう >>24
全く同じことをjsとvbsでやってみました。jsはうまく動作しますが、vbsは動きません
selectedにRowはないと言ってきます。レンジの選択はちゃんと出来ています
jsのコード
var book = GetObject("C:\\file.xls");
var sheet = book.Worksheets( 1 );
sheet.Select;
sheet.Range( "A1", "B10" ).Select
var selected = book.Application.Selection;
var x = selected.Column + selected.Columns.Count - 1;
var y = selected.Row + selected.Rows.Count - 1;
WScript.echo( "x=",x,", y=", y );
book = null;
WScript.Quit(2);
vbsのコード
Set book = GetObject("C:\\file.xls")
Set sheet = book.Worksheets( 1 )
sheet.Select
sheet.Range( "A1", "B10" ).Select
Set selected = book.Application.Selection
Set x = selected.Row ' ここでエラー
MsgBox "x:" & x
Set book = Nothing >>27
すまないな
>シート上のSelectionの情報を取るだけなら画面遷移を伴うSelectではなくActivateで十分
実質的にどう違うかわからないので申し訳ありませんが教えていただけませんか >>29
Selectによる画面遷移はユーザーとの対話を想定した処理で、当然描画処理の負荷がかかる
プログラム上で参照するアクティブなオブジェクトを切り替えるだけならSelectはしなくて良い >>28
>>Set x = selected.Row ' ここでエラー
x = Selected.Row >>24
いろいろ試してみてわかりました
もともと、エクセルのマクロで
y = Selection.Row + Selection.Rows.Count - 1
x = Selection.Column + Selection.Columns.Count - 1
と書いていたものをjsでそのままやったら動かないので、
sheet.Selectionとしたり、book.Selectionとしたりいろいろと試したのですが、
Appliction.Selectionだったんですね
x = book.Application.Selection.Row + book.Application.Selection.Rows.Count - 1
とすれは、jsでもvbsでも両方で動きました
実際は、
Set selected = book.Application.Selection
と一旦とってからの方がやりやすいですね。ありがとうございました >>30
jsで、Activateでやってみましたが、ワークシートも切り替わってますよ
Selectとの違いがわかりません
vbsではやってません >>36
直接は呼べなくてCOM経由でしか呼べない
VBA C# dll 呼び出し
とかでググれ C#わからんから無責任発言するけどC++でdll作りゃ問題ないならそうすれば? C++で橋渡しするならC++/CLIでできるね
でもそんな面倒なことをするより普通にexe作るかpowershell書くかして別プロセスとして呼べばいいよ
データの受け渡しはコマンドライン引数なり標準入出力なりを使えばよい なんでより面倒な方法をドヤ顔で書いてるんだよ w
C#で書いてちゃんと設定すりゃインテリセンスも効くというのにコマンドラインとかありえねー >>36
わかるけどスマホからサンプルコード書くのはしんどいわ
C# ComVisible Excelあたりでググって >>39
自分でC++dll書けるなら呼び出す側はかなり簡便になるように作れるよ
なによりワークシートの大量データを配列で丸ごと渡せるからね。
コマンドラインじゃ無理でしょ >>5
はるか昔に似たようなことやろうとしたが断念して↓で落ち着いた
MsgBox "Err." & err.Number & " " & err.Description, vbCritical, "モジュール名" >>37
やっぱ直接は無理か。管理者権限とかCOM経由しか無理なら諦めます。 >>5
CodeModuleプロパティでなんかできそうだけど使ったことないからわかんね エクセルのシートやセルのオブジェクトにどんなメソッドやプロパティがあるのか見れるところないですか >>12
のダウンロードした回数多くないか?
有用なツールだと認められた証だろう。作った人は自慢していいよ このスレの人ってやっぱりプログラマーが多いんですか?
それなりにVBA使えるようになった事務職なんですが、転職を考えています
想像してはいたんですが、VBAで職探しするとプログラマーばっかりですね
VBA活かせる仕事ってやっぱりプログラマーになっちゃうんですかね >>51
プログラマの定義から自明だろう
VBAのスキルだけで仕事するってことはVBAでマクロ作ること自体を仕事にするってことだろ?
それは即ちプログラマに他ならない
嫌なら他のスキルを身につけた上でその補助道具としてVBAを使うことを考えなさい あとはIT業界でプログラマ以外で入りやすいのはシステムオペレータやコールセンター
VBAを使う機会は少ないかもしれないけどVBAを習得できる程度の頭があるならそれなりに責任たある立場(バイトリーダーくらいを想像すればいい)にはなれるんじゃないかな Excel エンジニアから、ステップアップしてプログラマーになった人は、たいてい、Ruby on Rails !
まず、Ruby・Sinatra から、web フレームワークを始める
YouTube にも、そういう成功した人たちの動画がある >>52
経理財務畑で10年働いてるので、その補佐としてVBA使ってる現状です
VBA楽しいので、そればっかりの仕事はしたくないんです
たぶん嫌になっちゃうので。
なのでIT業界に行きたいわけじゃないんです
でも、VBAで探すとITばっかりだなーって悩んでるんです VBAは習得にかかる時間は他の言語覚えるのと同じくらい?
それとも簡単? >>57
同じレベルを求めるなら同じ
でもVBAは自称「VBAできます(キリッ」のレベルが他言語比で大幅に低いから、
人前で習得したと言っていいレベルに達するまでの時間は他言語よりずっと短い for i
for j
for k
for l
if cells(i,j)=cells(k,l) then
m=m+1
cells(m,1)=cells(k,l)
end if
next
next
next
next
できました! >>60
エラー処理(例外処理)が緩すぎる
やり直し >>56
仕事を効率化するシステムはある程度自分で作るのが当たり前の時代が来る(かもしれない)から
IT業界でなくてもプログラミングは必須になる(かも略
ただしそのツールの主流はVBAじゃないだろうね
いろんなツールや他言語も覚えて他人の仕事をどんどん奪ってください。
そうすれば時代の流れを加速することになるのでヒーローになれます。 MSがExcelにPython載せるっつってたから
君が卒業して社会に出る頃にはVBAは消えてるかも知れない >>64
まず型はいらない。
コマンドや関数はフローチャートの図形みたいな視覚化とパラメータで作成。
論理エラー以外のエラーは出ない仕組み。
やろうとすればいくらでもできるんじゃね? >>66
そんな軟弱な
それじゃ小学生向けのプログラミング教室と変わらないじゃん >>68
一般の個人がやるならこのくらいが普通。
HTML手書きの敷居を下げたホームページビルダーだってそうだろ。
プログラムがCUIっていうのに違和感を持つべきだと思う。 >>69
そそ、それをより深くしてさらに汎用化させた感じ >>66
やろうとすればというかもうとっくに先人たちが取り組んで諦めた分野だよ
学生の頃に配線型のプログラミング言語を使ったことあるけど難しすぎて習得を諦めた 先人たちの時代には難しかっただろう
しかし今のPC環境ならグラフィカルなプログラミングも実用化できるんじゃね >>13さんもう見てないかな
自分で使ってみたけどなんか違う・・・と思って考えてみたら
問題のシャッフル出題(各問1回だけシャッフルして出題)が足りないという結論に
バグもつぶしたし、まだ見てるならレスください すみません、こういうのは出来ますか。
How are you? I’m looking
forward to see you.
を
How are you?
I’m looking forward to see you.
になおす。
要は、中途半端な改行がある文を、一行にまとめる。 >>74
みんなそんなに全力でテキストベースのプログラミングを避けたいのかねえ?
使いこなせば強力な武器になるとは思わんのか? >>76
改行をなくすだけなら比較的簡単にできる
適切な位置で改行しろってなら、適切な位置を事前に完全に定義すればまぁできる
>>77
おれは別に避けたいとは思ってないしその必要もないけど
テキスト以外のプログラミングには従来のプログラミング言語にない可能性だってあるしな DOSはDOSで使いやすかったと思う。
Windows出たときいらねーべって思ってたけど今思うと3.1はやっぱりいらない。 >>78
76です。
すみません。それでは、
.で改行できるようにお願い致します。 >>80
一旦改行を全て削除して、そのあとでピリオド、クエスチョンマーク、エクスクラメーションマークで改行すればいいんでは。 >>81
改行を削除できますか。
仕事で、大量の英文を整理したいので困ってます。 線つなぐやつはサブルーチンが正体不明のアイコンになるからものすごくわかりにくい
逆にわかりやすいプログラムを描くには高度なアイコンデザインセンスが必要ということだ
そんなの天才にしか使いこなせない >>82
もうVBA関係なくなっちゃうけど、普通のエディタ使って置換機能を使えばいいだけでは。 >>84
セル内の文字列を対象にしてると思うからエディタでは無理では?分からないから適当に言うんだけど。 >>80
質問はうけつけん
Sub RemoveCRLF()
Dim target As Range
Dim str As String
Set target = Sheet1.Range("A1")
str = target.Value
str = Replace(str, vbCr, "")
str = Replace(str, vbLf, "")
str = Replace(str, ".", "." & vbNewLine)
target.Value = str
End Sub >>76
あまりいけてないけど、ぼくも考えた
Dim str As String
str = Range("A1")
Dim re As Object
Set re = CreateObject("VBScript.RegExp")
re.Global = True
re.Pattern = "[\r\n]"
str = re.Replace(str, "")
re.Pattern = " +"
str = re.Replace(str, " ")
re.Pattern = "([?.]) *"
str = re.Replace(str, "$1" & vbLf)
Range("A2") = str >>75
最新版は5ですよね?使ってみましたがオブジェクトエラーが起きてどこで停止しているかみてみると、ソート処理時に停止する。
そこで4_2をベースにこちらでカスタマイズして、ボタン1つでセル内の文字列をシャッフルするコードをネットから拾ってきました。
ついでに縦横の切り替えもボタンで実現してます。
やりていことこ実現できているので満足です そうでしたか、なんかすみません
じゃ本当に終わります。 Python などの形態素解析で、文末でも判定すれば? >>84
例えば?メモ帳とか?
改行を無くす置換はありますか? >>92
ありがとうございます。一つのセルに最大どんだけテキスト貼れるかですね >>92
cntl+jか。知らなかった。ほかのワードとかでも使えるかな セルを指定する時とか”A1”とかちまちま書くのが普通?
めんどくさいんだけどそんなもの? >>95
状況とやりたいことによる
範囲指定する書き方も出来るし、変数で楽できる場合もある >>93
Excelと関係ない英文を整形したいだけならテキストエディタを使った方が早いぞ
せめてWordにしとけ 「何の条件」で「何を」「どのようにしたいか」の中で「何の条件で」が出てないな
「何を」「どのようにしたいか」も一部の条件しか出てない気がする
連想ゲームじゃないんだから質問はちゃんとかけよ >>76
この質問は
Excelの枠に配置で、折り返して全体を表示するに
以下の改行のない文を貼り付けた時に
How are you? I’m looking forward to see you.
セルの幅に合う位置で改行されるのを思いの位置で改行したい
ってことだろ、思いの位置が明文化されないとな
例えば英文であるかわからんが「...」みたいな文とか「!!」みたいなとかもありそうだしな >>95
あと以下のようにしておくと面倒でなくなるよ
cns_COL_ID = “A”
Range(cns_COL_ID & 1) = “ID” >>95
貼り付けられたイベントで処理するのも普通だけどな
位置は分かるから、そのセル・レンジを処理する Private Sub Worksheet_Change(ByVal Target As Range)
まあ、Changeイベントで
If Application.CutCopyMode = xlCopy Then
End if
コピーされた場合「Range」に対して処理を書くんだな セル上でドラッグドロップしたら、それでプログラムが動くようなことってできますか
たとえば、縦1列に20個のデータが入っていて、その1つを別の場所に
ドラッグドロップすると順番が入れ替わるようにするとか >>104
こうかな
Sub Worksheet_change(ByVal Target As Range)
if target.column = 貼り付けた列番号 then 配列に突っ込む
配列をソートする
配列をセルに書き込む
End Sub >>106
あとApplication.Enableevents = Falseしないと配列をセルに書く時にWorksheet_changeが起きて無限ループするから気を付けて >>104
それって、切取りと切り取ったセルの挿入のことじゃない >>104
シフト押しながらドラッグするだけやろ。
テーブル定義ならシフトすら必要ない。
既存の機能を自力で作ってどうするんや >>94
置換前にcntl+jと入れると、置換ボタンが押せない。 >>96>>97>>101>>102
ありがとう
>>101
これはなぜ楽になるの? >>113
楽というかマナー
意味の分かる定数で定義することで他人がプログラムを追わなくても理解できるようになる プロパティ使ったほうが定数よりずっとわかりやすいよ 決まりきったセル(範囲)参照する時は名前定義なりテーブル化した方がいいと思うけどな vba初心者です。
マウスイベントやスリープなどのapi を使って
会社で使うツールを半自動化してますが、
こういうアナログな方法ではなく、
マウスでクリックしなくてもツールがアクティブになったり、
スリープではなく画面が遷移したのを読み取って次の命令を実行してくれるような
ものを作るにはどういう学問を学べばいいですか? >>117
UI Automation
ただ色々アレで結局Win32API併用することになることが多いけど 自作したdllファイルに文字列を投げて配列を受け取りたい場合
Public Declare Function 〇〇 Lib "△△" Alias "□□" (string path)As string()
〇 自分で付ける関数名??
△ dllファイルの場所フルパス??
□ dllファイル内の何か?
それぞれ何を指すんですか?
ちなみにこれでも似たような事ができるんですか?
Dim tarApp As Variant
Set tarApp = CreateObject(“◎◎“)
tarApp.Documents.Open FileName:="〇〇"
Set wdApp = Nothing >>121
まあ、気楽に回答しておく
>〇 自分で付ける関数名??
その通り
>△ dllファイルの場所フルパス??
Pathが通ってればフルパスでなくてもよい
>□ dllファイル内の何か?
別名宣言できる・・・まあ、調べろ
>ちなみにこれでも似たような事ができるんですか?
>Dim tarApp As Variant
>Set tarApp = CreateObject(“◎◎“)
> tarApp.Documents.Open FileName:="〇〇"
>Set wdApp = Nothing
書いている意味が理解できてないだろう、Office系のソフトはちゃんとしたルールで作られてるが
こんなこと気にする前に、有効なDllを作ってみろよ
尚、理解できてないことが丸わかり >>123
まあ、間違ってるんだろそれだけ
ソースを出さなきゃ何もないよ
イベント鳥杉ってよくあるからな
有効な手段は、護摩をたけ、できるだけ激しく火事には気を付けろ たとえば、A1からC50までデータがあってA列をキーにソートしたいのですが、
途中たとえば、10行、15行、20−25行は抜かしたいのです。 これらにはコメントや他のものが入ってるので
でもそれらを抜かして全体でソートしたいのですが、Unionで繋いでやったら複数のレンジは出来ないみたいな
エラーを返されました
何かいい方法はないでしょうか 例えば、画面表示は止めて、メモリ上で行を移動させてソートする行をまとめてからソートして、
また行をもとに移動させてから、画面上に結果を表示とか、出来ると可能性があると思うのですが >>126
if i = 対象行 then
行入替え
end if
とかでいいんじゃね? >>126
行を非表示にしたら対象から外してくれんかな…(試してない) >>121
〇 自分で任意に付ける関数名
□ dllがエクスポートしている関数名 dllってよくわかんないだけどvbsのexecuteglobalみたいな感じ? >>129
マジかあ。 やってみた。 出来てる
なんだよ、プログラム作っっちゃった。 ソートしないところを一旦別に移して圧縮してソートしてから
下に戻すってやつ
なんだよ、 この2時間返して w >>132
まあ、普通にデータはテーブルでもてば良いだけだろ
整形は別シートででーたをさんしょう >>131
外部にライブラリーなどを持たすんだから
Include の方が近いだろ よろしくお願いいたします。
VBAで、半角カナ文字列を与えると、その文字列の中にある、
ァィゥェォャュョッ などの小さい字をアイウエオヤユヨツなどの大きい字(半角カナ)に変換して返す
functionを作りたいのですが、どう書いていいのかわかりません。
ひとつずつ、ァをアに変換、ィをイに変換、のように書くしかありませんか?
まとめて書く方法ってあるのでしょうか? Ruby のNKF とか、文字列.tr とか、正規表現とか 60項目7万件のjsonデータ読んで保存した。
開いたらモジュールとフォームが破損って何なんだよ。うう吐きそうだ。
10Gじゃメモリたりなかったのか?いや、それならそうメッセージがでるはず。
まさかこんなんでコード飛ぶとは思わなかったからバックアップは取ってない。
10分おきの自動バックアップのデータはあったけどデータ取るのに2日かかったからとっくに消えてる。
もう作る気おきない。
参った。 >>137
ざまあ
そういうのはCSVを介するのが定石だろう >>135
dictionaryオブジェクトで連想配列作れば?
Dim myDic As Object
Set myDic = CreateObject("Scripting.Dictionary")
myDic.Add "ァ", "ア"
myDic.Add "ィ", "イ"
myDic.Add "ゥ", "ウ"
Dim str As String
str = myDic.Item("ァ") #<--ここに参照したい文字を渡す
MsgBox str, vbInformation
https://www.sejuku.net/blog/29736
動くかわからんけどお試しあれ。 >>135
あんまり綺麗じゃないけど
Function kanacaps(s1) As String
For i = 1 To Len(s1)
c = Mid(s1, i, 1)
If "ァ" <= c And c <= "ッ" Then
Select Case c
Case "ァ" To "ォ"
s = 10
Case "ャ" To "ョ"
s = 40
Case Else
s = 19
End Select
Mid(s1, i) = Ch r(As c(c) + s)
End If
Next
kanacaps = s1
End Function 一部の文字列関数が、なぜか5ちゃんねる全体のNGワードになってるんで、わざとスペースを入れてある Ruby では、
str = "ァィゥェォャュョッあ"
puts str.tr( "ァィゥェォャュョッ", "アイウエオヤユヨツ" )
#=> アイウエオヤユヨツあ もっとシンプルなのができた
Function kanacaps(s1) As String
t = "アイウエオヤユヨツ"
For i = 1 To Len(s1)
c = Mid(s1, i, 1)
If "ァ" <= c And c <= "ッ" Then
Mid(s1, i) = Mid(t, A sc(c) - 166, 1)
End If
Next
kanacaps = s1
End Function しつこいけど、これで最後
Function kanacaps(s1) As String
t = Array("ア", "イ", "ウ", "エ", "オ", "ヤ", "ユ", "ヨ", "ツ")
For i = 1 To Len(s1)
c = Mid(s1, i, 1)
If "ァ" <= c And c <= "ッ" Then Mid(s1, i) = t(As c(c) - 167)
Next
kanacaps = s1
End Function 最後と言いながらもう一度
これってまだまだコンパクトにできるパターンだな
Function kanacaps(s1) As String
t = Array("ア", "イ", "ウ", "エ", "オ", "ヤ", "ユ", "ヨ", "ツ")
For i = 1 To Len(s1)
c = Asc(Mid(s1, i))
If 166 < c And c < 176 Then Mid(s1, i) = t(c - 167)
Next
kanacaps = s1
End Function 1回しか使わない変数を消した
これ以上の短縮は無理かな?
Function kanacaps(s1) As String
For i = 1 To Len(s1)
c = Asc(Mid(s1, i)) - 167
If 0 <= c And c < 9 Then Mid(s1, i) = Array("ア", "イ", "ウ", "エ", "オ", "ヤ", "ユ", "ヨ", "ツ")(c)
Next
kanacaps = s1
End Function >>147
横レスだけど
他の言語に比べかったるいけどおいておいて
変換に使う文字列または配列はfunctionの外
変数はアドレス渡し function内で文字列を書き換え
変更が有った場合 true なかった場合false
使い勝手と動作速度を優先する
とスマホで書いてみる >>147
たしかにs1を書き換えつつまたそれを返すというのは無駄だ。
ByValで受けて書き換えた結果を返すかByRefのままでSubにするかだと思う。
Booleanで返すのは今時の趣味には合わないんじゃないかな。 >>149
セルを書き換えるべきか書き換えないかの判断をする
全てのセルの書き換えは時間もかかるし、空白のセルもある
必要ないデータは書き換えないでいいようにする
if kanacaps(s1) then cells(i,j) = s1
のように >>150
s1自体は As Stringだろ
元の質問もワークシート関係ない話のように見受けられる >>151
だったら、このスレ関係ないな本当にそう思うのか?
自分の主張じゃなく要求者の状況を読まなければ意味ない
150の書き方でならシート全てを変換するfunctionも簡単にできるけど
お題を読めないのは厳しいな データ量と出現頻度と、呼び出し側でのデータの持ち方がわからない限り、最適解は出せないと思う
用途はなんだろう?半角カナが通るのにカナ小文字が使えないシステムなんて、大昔のオンラインシステムぐらいしか思い付かんけど >>153
今更聞いてる処がどうなの?
こんなのどっちでも簡単なのに、私は書かないけどなポリシーです >>152
データソースがRangeであるか否かに関わらずs1は As String相当 だろう。
件の関数が何を返すべきか(もしくはSubにすべきか)という話とは関連が薄い。 >>155
別にfunctionの使い方を考えないならどうでもいいじゃない
ただ誰も使わんだろ、それは言い過ぎか使うやつはいるな 基本的なことを理解せず、ソース書くやつって恥ずかしくないのかな? 俺は理解したいけど使うの自分ならまぁ動けば良いや派です
話題変わるけど今はselenium使えないの?
firefox操作したいけど色々なサイトのコード試しても動かんのだけど最新のseleniumVBAでfirefox操作するVBA使ってる人居たらfirefox起動からログイン処理するコード貼ってほしい >>157
> 基本的なことを理解せず、ソース書くやつって恥ずかしくないのかな?
確かに>>150は恥ずかしいなw 配列を使わざるを得ないなら二次元配列に変更前と変更後を並べて突っ込む >>161
まさか、148で変更をBoolean返すようにしたのを前提に150を書いたけど
何も読まずに書いてる? >>163
結局そうなるよね。
一括で貼り付ければ楽なのに、わざわざ If でまだらに個別セットなんて却って遅くなる。 > 基本的なことを理解せず、ソース書くやつって恥ずかしくないのかな?
とか言いつつ質問者の意向もわからんのにコード書いてドヤるとか w >>169
じゃあ、お前ヒントも書かずにわかるのか?
ってか、引きこもりの文盲か? >>167
どんだけ、アホで生きてるんjンだよ
関数の貼り付けとセルへの値の書き込すらわからんかな >>170-172
だから
> 基本的なことを理解せず、ソース書くやつって恥ずかしくないのかな?
とかが不思議ちゃんて言われてるんだよ
セルへの書き込み程度でドヤるような奴だからしょうがないだろうけど w Range("A1")="名前"
Range("A2")="住所"
Range("A3")="性別"
Range("A4")="郵便番号"
みたいな複数にわかる処理を
Range("A1:A4")="名前、住所、性別、郵便番号"みたいな感じ(もちろんこれではダメ)で
一行(一回の処理)でまとめて設定できるような方法ってありますか? Sub kanacaps(s1 As String)
とした場合、
対象配列Aの各要素A(i,j)に対して
kanacaps(A(i, j)) をループで回すだけ。
シートに書き出したければ単にAを貼り付ける。
このとき書き換えがあったかどうかを判定する必要はない。
Function なら
Function kanacaps( ByVal s As String) As String
で A(i, j) = kanacaps(A(i, j))
これも書き換えがあったかどうかを判定する必要はない。
普通は後者を選ぶだろう。 >>177
これダメなやつ
最も負荷の掛かるセルへのアクセスは最小限にするべき
コードが短ければいいってもんじゃない >>178
なんだよ
セルの個数の問題なのか貼り付け回数の問題なのかはっきりしろ スマホは書いてる途中で書き込んじゃう癖が有って申し訳ない
例えば日付を月日で表しているセルを文字列で取得すると月日の文字が取得できる
その文字をそのセルに書き込むと数値としての月日じゃあなくなるよな
不用意に変換しないことも大事なんだがな 気になってshift jis の文字コードを確認してみた
If 166 < c And c < 176 Then
これは半角小文字だよ
お題は全角カタカナ小文字だろっと 凄いよな。
何でこうも、どんな用途に使うのかわからないような処理ばっか出てくるんだか。
そのうち、VLOOKUP(縦検索)でもHLOOKUP(横検索)でもない、
斜め検索のJLOOKUP作れとか言い出しそうだな。 データ処理の関数がわかんなくてお前らに横投げしてるからだろjk まあ何だな 全角カタカナの文字列に半角突っ込む奴の指示は聞かないけどな 最初の質問は>>135だぞ
処理したいのは半角カナ、作りたいのはFunction、関数の返す値は修正後の文字列と仕様が明記されてるのに、どうしてBooleanだのByRefだのが出てくるんだよ
おまけに全角とか言い出すやつまで出てくるし ァィゥェォャュョッ 全角小文字
ァィゥェォ 半角小文字
書いてるのが全角だったからな =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE
(A1,"ァ","ア"),"ィ","イ"),"ゥ","ウ"),"ェ","エ"),"ォ","オ"),"ャ","ヤ")
,"ュ","ユ"),"ョ","ヨ"),"ッ","ツ") >>188-189
そこは最初から違和感あったわ
> VBAで、半角カナ文字列を与えると
って書いてて
> ァィゥェォャュョッ
って全角で書いてるからネタだと思って放置してたけどァィゥェォッュョみたいな文字ってスマホだと入力できないのな
(いや、できるかも知れんが俺にはわからんかったのでこれはコピペで入力した)
まあそれならそうと書いて欲しい
この手の変換はそれなりに需要があるみたいで
カタカナ 小さい文字 変換 vba
とかでググるとそれなりにヒットする
とりあえずは
https://www.relief.jp/docs/002223.html
とかを参考にすればいいと思う スマホで半角カナ小文字の入力は、俺のXperiaの場合だと「la」と入力すると全角小文字の「ぁ」になって、変換を押すと候補に半角「ァ」が出てくる フリック入力ならキーパッドの「ま」の下の「小」をタップすると小文字になって、候補に半角も自動的に出てくる >>175
1) Range("A1:A4") = WorksheetFunction.Transpose(Split("名前、住所、性別、郵便番号", "、"))
2) Range("A1:A4") = WorksheetFunction.Transpose(Array("名前", "住所", "性別", "郵便番号"))
3) Range("A1:A4") = [{"名前";"住所";"性別";"郵便番号"}] VBAの2次元配列って1次元配列として使えないのね。不便。 二次元配列は何が入ってるか分かりにくいしネストも増えやすいから構造体かクラスを使う >>198
割り切ってジャグ配列をメインに使えばいい
Rangeはしょうがないけど >>199
XLシートが二次元の表なんだから難しくないだろ。
三次元なら立体を思い浮かべればいい。四次元になると時間をイメージかな。そこまでやったことないからわからん。
三次元までのネストの深さは気にならないな… ifとかで増えるにしても。増えすぎるなら内部を切り出すかな。
まあ、仕様によってどう作るかはいろいろだけど。 n次元 = n階層の木構造とイメージするのが単純で良いと思うが n次元より配列の配列の...の方が再帰的に扱いやすい >>203
日本語不自由?
難しくないのは二次元
わからんのは四次元 モジュールで
Dim arr() As String
Dim aaa As String
ReDim arr(2)
arr = ThisWorkbook.arr
aaa = arr(0)
ThisWorkbookに下記を設定
Public Function arr() As String()
Dim arra(2) As String
arra(0) = "日本"
arra(1) = "米国"
End Function
Thisworkbookの配列を呼び出したいんですがどこが間違っていますか? >>206
arr = arra
End Function >>209
ああ、よくある、結局原因がよくわからないやつね。
試したら、>>207が正解だったわ。
面白いな。Thisworkbookに書いてあるものを呼ぼうなんて、
考えたこともなかったから、それが原因かと思ったわ。 そもそも配列名とプロシージャ名が同じところもおかしい 馬鹿はそんなもん
間違いにくいようにコードを書くことをしない >>212
コードを書かなきゃ間違えないということか、なるほど。
それとも馬鹿は誤解を受けないような文章を書くことをしないってことか? 俺が分かるからいいみたいな考えだとチームで開発はできないよ >>214
それはよく解る。保守性も悪くなるよね。 一般的なプログラミング言語なら正しいけど、VBAだとかなり厳しくない?
下に合わせるとそれこそ可読性も保守性もクソもないゴミにしかならないよ 言語は問わず下に合わせるとゴミになる
属人性の排除といって下に合わせたがる人が少なく無いけどあれは間違いなんだ VBAで下に合わせると、やたらSelect & Selection.Copyが多い、
マクロの自動記録じゃねえのこれ?
みたいなのが出来上がる。 ActiveHogeHoge へ参照が多いとそうなんだろうなと思うことにしている >>216
>>217
>>218
意味が伝わってないみたいだけど
cells(i, 1) = arr(i-1, 0) がセルに何が書き込まれるかはコードの前後を追わないと分からないよね
これを分かるようにするのが分かりやすいコード
プログラミングが上手か下手かは関係ない話 多次元配列も Dim lngEleName As Long とか専用ループ変数を準備してるならいいけど、ijkで回してるのを見た日にはそいつを殴りにいくね。 ひえー
なんか諸先輩方思うところ多かったようで
自分も書くとき気をつけないと
初心者ですを免罪符にしないように気をつけよう >>221
i, j, k で分かりにくくなるような長ったらしいプロシージャを書くのが悪い >>225
つまらない趣味にこだわるのは中学生までだぞ 偏見かもしれんがプログラミングで日常言語に近づけようとするやつは代数とか苦手だった?
って思っちゃう >>227
上司「このiってなに?ちゃんと説明して」 単なるループカウンタですけど?
見ればわかりますよね? >>232
しばくぞコラ(LongとElementだよ(にっこり)) ループカウント用のプロシージャ内ローカル変数でiとかjとか使うのはありだと思う
モジュールレベル以上の参照スコープを持たせた変数をiとかjとかarrとかbufとかで宣言されてたら流石にキレるな 俺はゴールデンの方が好き
猫飼ってるから無理だけど sheet1, sheet2とあって、sheet1に、
Private Sub ButtonClear_Click()
があります
これをsheet2のボタンを押したときに呼び出したいのですが、sheet2のsubで
Private Sub ButtonTest()
Worksheets("sheet1").Select
ButtonClear_Click
end sub
としてもそんなsubはないと言ってきます。他にもいろいろと試したのですがどうしたらいいのでしょうか
また、標準モジュール内で、
Sub ModuleTest()
Worksheets("sheet1").Select
ButtonClear_Click
end sub
としても同様に動きません
Worksheets("sheet1").ButtonClear_Click
とかしてもダメでした 共通の処理は共通モジュールかクラスに置いてください
シート1、シート2からはその共通の処理を呼び出してください
イベントハンドラはユーザーコードから呼び出すものではありません >>238
Privateが付いてるプロシージャはそのモジュール内でのみ呼び出し可能
sheet1とsheet2は別モジュール
だから怒られてる >イベントハンドラはユーザーコードから呼び出すものではありません
面倒くさいとき、普通に呼び出してたわ。 >>240
Public にしてもはずしてもダメです >>243
そもそもボタンってデフォで標準プロシージャに追加されなかったっけ?
標準モジュール作って、Sub ButtonClear_Click() をまるごと移動させたらいけんじゃね? >>244
そんくらい知ってるよ、夏の日の1993だろ。
昭和生まれをナメるなよ。 調べてたらこんなのが出てきました
http://jscript.zouri.jp/Source/ExcelCtrl.html#LINK7
ちょっとずれてはいますが、ここで
// シートのマクロ関数を呼び出す
ExcelApp.Run( "MacroTest.xls!Sheet1.func1" );
ってのがあるから、標準モジュールだけじゃなくて、シートの関数も他のシートからも呼べるんだよね
マネてやってみたんだけどうまくいかん いや、普通に、シートを指定するんじゃ駄目のかな。
>>206はThisworkbookに続けて関数名書いてるけど。
クラスモジュールもそうやって指定するでしょ? ???
lngEle?なんかよりi,j,kの方がよっぽど良いだろ。
どんなスコープの場合でも特別な意味の無いループ変数だよ。
世界中で、さらにいうと他言語でも共有されてる価値観だろ。
まあ、ローカル以外で使われることは無いけど。 シートモジュール特有の制約があるのかもしれないけど調べるのめんどい >>238
根本的に考え方が分かっていない。
まず、色んな所から呼び出したいものは標準モジュールに書く。
そして、そいつを色んな所から利用するように設計する。
君の場合はButtonClear_ClickをSheet1からもSheet2からも使いたいんだからButtonClear_Clickの中身を別関数にして、Sheet1のButtonClear_Clickからその関数を呼び出すようにする。 vbaerは他の言語やらんから非常識なコードを悪気なく書いてしまうんだよな >>252
ちょっと違うんだなあ
sheet1にPrivate Sub ButtonClear_Click()
ってかいてるでしょ。 この処理はシート1に対してする処理なのです
それをシート2から、ある特定のタイミングでしたいので、こうなっている
標準モジュールにあるものはもちろん呼べるけど、疑似的にもそうしないといけないのかな >>254
Worksheets(“シート名”).Range() = 処理 試したら、Sheet2.ButtonClear_Clickで動くわ。
もちろん、Privateは削除でね。
>>252
一般的にはそうだけど、
実際には出来るんだから、思い込みだよ。 ていうかsheet1にコードを書いたとしてもsheet2がアクティブになってればそっちに書き込まれるからね >>256
Worksheets("sheet1").ButtonClear_Click
みたいな仰々しいことしなくても良かったのね。 ありがと。 あとでやってみる >>254
違わない。
設計の話をしている。
シート2からも呼び出すんだからシート1に対して行う処理であっても変わらん。
というか、基本的な所で噛み合ってないな。
どんな所に書いてもいきなりブックやシートの省略はしないのが基本だぞ。
Withを使うかオブジェクト変数で受けるのが基本だ。 >>256
おかしいなあ。 オブジェクトが必要ですっていうエラーが出てきて動かない >>261
これでtestって出ない?
[シート1]
Sub ButtonClear_Click()
MsgBox "test"
End Sub
[シート2か標準モジュール]
Sub ButtonClear_Click()
Sheet1.ButtonClear_Click
End Sub >>264-265
sheet1.Selectをしなくても、セルへの代入だけなら出来た.。 シート2のボタンを押しても、シート1のセルに書き込まれる
でも、Cells(10,10).Selectみたいなセルの選択をするときは、sheet1.selectをしておかないとエラーになる >>266
書き込みたいシート名を指定する
Worksheets(“シート名”).cells(1,1) = >>266
こうやって書けば。
Worksheets("Sheet2").Cells(10, 10).Value = "test" >>267-268
いやだから、書き込みだけなら、問題なく出来るって書いたじゃん
裏でも出来る
でも、セルの選択とかが入ると、シートをSelectして動かないとダメ vbaの関数ってデフォルトが参照渡しなんすね
やらかすとこだった お前らオブジェクトのこと全然わかってないんだな
馬鹿ばっか >>274
継承されたわけでもないオブジェクトから別のオブジェクトのメソッドをどうやって呼び出すかわからんのか?
馬鹿は死ねよ。 シート1内外から呼べるPublicな共通関数を作って、クリックイベントハンドラのコードと他モジュールのコードの双方から呼ぶようにすれば良いだけでは
イベントハンドラを直接コードユーザにコールさせようとするのはおかしい >>272
ByRefもByValも付けずに宣言するとそれはByRefになるって事をかな?
であれば既にやらかしてるのを気づかずにいる可能性があるから過去のモジュールを点検した方がいい いやよく考えるとイベントハンドラを呼ぶのはおかしいがシート2クラスのメソッドを呼ぶだけなら別におかしくはなかった
それだけでは共通化する理由にはならない >>276
へーシートもオブジェクトなのか
全然意識してなかったわ
勉強になったよありがと
でもお前口悪いから友達いなさそうw シートモジュールに構造体宣言してハマった記憶がある
そういうことだったのか 頭が悪い 顔が悪い 目が悪い 口が悪い
性格も悪い 手癖も悪い 足腰も最近悪い
酒癖も悪い 女癖も悪い 寝つきも悪い
そんな俺でもその返事の仕方は失礼なんじゃないかな?
とは思うけど。
もしや高度なツンデレさんなのかな?
と、解釈して
次の方 ( ゚д゚)ノどうぞ シートもオブジェクトなのか、ってのはちょっと驚いたな
シートどころか自作フォームも含めてGUIで見て触れるもののほぼすべてがオブジェクトだぞ なんか、バカばっかりだなあ
>>269に他のシートにもアクセスできるって書いてあるだろ。何がオブジェクトだよ
ただ、セルのセレクトは出来ないって >>286
バカはお前。
そのセルのセレクトができないと言ってる元の命令がオブジェクトがどういう階層になってるか分かってない典型的な例。
そういう人のコードだから、セレクトなんて必要無いだろうなと先読みしてるんだろう。
何しろセレクトすることなんて極めて殆ど書くことが無い(必要となることが無い)処理だからな。 ブックもシートもセルもボタンもシェイプもみんなオブジェクトだよ
WindowsはOSそのものがオブジェクトの塊
そういうふうに設計されてる Selectionはイミィディエイトからはよく使う 化石観たいな臭いレスでも良いけど
もうちょっと面白いレスが観たいな
VBAネタもう飽きた https://japan.cnet.com/article/20087747/
「Microsoftにとって、(Officeのような)ウェブベースのアプリケーションサービス
を提供することは願ってもないことだろう。これにより、エンドユーザーや違法コピー
の問題をもっとしっかりコントロールできるようになる。しかも、大量にメディアを
用意したり、それを流通させるコストも不要になる」
--Garcia on Slashdot VBAスレにまで来てVBAネタ飽きたって、こんなとこくる暇があったら病院行った方が良いんちゃう? Selectメソッドは記録マクロの記述のためだけに存在する命令と言ってもいいくらいのものだからな
実際に実務でSelectメソッドを書いたことは殆どない
特定のセル範囲(特に複数セル)が選択された状態を作り出すことに実務上の意味があるならば書かざるを得ないんだろうけど >>296
コードの最後に
cells(1,1).select
って書いておくのが僕 カーソル位置の初期化によく使うけどな。Select スクロールの有無を選べるApplication.Gotoの方が小回りが効くわな SelectよりActivateの方がしっくりくる selectは複数できる
acrivateは1つだけ
selectしたcellsはselectionで取得でき、
activateしたセルはActiveCell
また、
ActiveCellはsheetではなくapplicationのメンバ
Application.ActiveCell.Select
↓はできない
sheets(1).activeCell.Select
今色々試しただけだから、間違ってたらゴメン WebBrowserのフォームに文字列変数に入れたHTMLを反映させるのってどうすれば良いですか? >>306
説明が分かりにくい。
WebBrowserのフォーム
→フォームにWebBrowserコントロールを貼り付けたもの?
文字列変数に入れたHTML
→指定したURL?
フォ―ムにWebBrowserコントロール貼り付けて、指定したURLを表示させたいってこと? それともHTMLのソースコードを元にブラウザ表示させたいってこと? >>306
input type="text"を変更したいんでしょ
メールアドレスに「123」を入れる例
めっちゃめんどくさいけどガンバレ
Private Sub UserForm_Activate()
WebBrowser1.Navigate ("https://opentype.jp/oteditmoney.htm")
End Sub
Private Sub UserForm_click()
Set hec = WebBrowser1.Document
Set mailaddress = hec.GetElementsByName("MailAdress2").Item(0)
mailaddress.Value = 123
End Sub 質問じゃないけどcsv取り込みでQueryTable使ったら感動した
ググるとほとんどLine Inputでやってるんだもんなぁ ExcelでJavaScriptが使えるみたいだけど、どんなことに使えるのでしょうか? >>310
便利なんか?
住所の番地ってどうにかできるんかね
1-1が日付扱いになってしまう
>>311
jsがどうこうではなく、vbaが化石すぎる
jsは慣れれば超楽に書ける。これから覚える人は大分楽できるんじゃないかな
ただ、jsはところどころじゃあくなので気をつける必要がある
具体的にはundefined >>312
おぉ!レスありがとう😊
そっかぁvbaは化石か…
今職場で必要だから、業務を通して勉強してるんだよね。
JavaScriptは少し勉強してたけど、会社が受け入れてくれるかな。 >>313
幾つか忘れていた
jsのメリット
・jsはwebでも標準的な言語
・イラレのスクリプトもjsで動かす事もできる。ほとんど使わないけど
・googleSpreadsheetのマクロはjs
ただ、化石言語にもいいところはある。今までのノウハウがweb上に山程ある
そして仕様変更も20年なかったから、全コードがそのまま使える
(他の言語はバージョン違いでエラーが発生したり、全く動かなかったりする)
結局やることはエクセルのスクリプトなので、vbaでも十分ちゃ十分、
jsのノウハウが積み上がるまでは、vbaの方が楽出来ると思う >>315
なるほどなるほど。
詳しく説明してくれてありがとう!
たしかにvbaは歴史があるから、調べてるのは楽だよね。
JavaScriptはしばらく家で勉強した方が良さそうだねw
時期をみて上司に提案してみるよ! Java script は
VBA → VB.Net → ASP.net って勉強して行く過程で勉強することになるから
そんなに慌てなくてもいいよ >>317
ドヤ顔のところ申し訳ないけど、ASP.NET(最新のものではなくVBerが知っている方のASP.NET)も化石だよ ちなみに最新のASP.NETと呼ばれるものはVBer達がよく知っているASP.NETとは全く互換性がない
それどころか.NET Frameworkすら切り捨てた >>319
知らなかった、昔のASP.NETの印象しかない。名前が完全に足引っ張ってる >>307
>>309
説明不足すみませんでした
ユーザーフォームにwebBrowserのコントロールを張り付けて、そこにURL指定ではなくて直接htmlの文章を書き込みたいです。 >>321
かなりめんどくさいことをしている気がする
やりたい事はこれじゃないんじゃないか
Private Sub UserForm_activate()
'多分一回呼ばないとダメ
WebBrowser1.Navigate ("https://example.com")
End Sub
Private Sub UserForm_Click()
html = "<div>foo</div>"
WebBrowser1.Document.body.InnerHtml = html
End Sub 四角の領域を表す構造体にRECTというのがありますが、領域が10個あってしかも定数です
その中にあるポイントがあるかどうかを判断するのに、 PtInRectを使いますが、10個のRECT領域をどうやって
定義するのか考えています
Dim rect1 as RECT, rect2 as RECT ,,,,, rect10 as RECT
とやって、これらに定数を代入するときにいちいち
rect1.Top = 10
rect1.Left =10
---
rect10.Bottom = 1000
rect10.Right = 1970
とかやってたら大変です。 Cとかなら
rect1 = CRect( 10,10,100,100)
って出来ますが、VBAでは出来ませんか。 またやりたいのは、PtInRectなので、簡単に
if PtInRect( CRect( 10,10,100,100), x,y) <> 0 then
みたいにしたいのですが、どうしたら一番スマートに出来るでしょう? >>323
ごめん勘違い
GetCursorPos() >>323
またまた勘違い
座標の指定はむりじゃね
それぞれの四角形の位置関係に規則性はないんでしょ Topとか名前を付けないで配列の要素番号に対応づけるとか >>322
それです!ドストライクです!!
エスパーさん手間を掛けて本当にすみませんでした。
二日考えてダメだったんですけど一回何か表示させる必要があったんですね。
あと次回は自力で出来るように頑張ります〜!!
ありがとうございました! カンマ区切りのCSVファイルを2次元配列に入れたい。
Dim arr()
arr=getCSVData(strFile)
private Function getCSVData(byval ...)as string()
Dim tarArr()
//処理
getCSVData=tarArr
end Function
こんな感じで配列にして1次元が行、2次元が列に格納したいんですが
ReDim、ReDim Preserveのタイミング等々が分かりません。
先に一度開いて行数と列数の最大を取得してからReDimでtarArrを2次元配列にし、もう一度開いて一行ずつ読み取ってカンマ区切りをsplitして配列に入れてからUBound分ループしてtarArrに入れる方法ですかね? >>329
多次元配列は最後の要素しか拡張できないから、左の要素はUbound(Split(1行目,”,”))で最初に確定させるしかない
右の要素はredim preserveで拡張できるから普通にループで増やしていけば良い >>323
クラスにしたらいいんじゃないの
vbaで引数付きコンストラクタの実現は難しいけど、
四つの座標情報を引数に取るプロパティ関数を用意して、Rect構造体のプロパティを持たせるようにすればそれらしいことができるのでは >>331
VBAでもクラスって出来たんですね。 ちょっとググってみました
ありがとう。 これは知らなかった >>323
構造体でできなくはない
VBAの構造体、制限多いけどな
Public Type Rect
Top As Integer: Left As Integer: Bottom As Integer: Right As Integer
End Type
Public Function CRect(Top As Integer, Left As Integer, Bottom As Integer, Right As Integer) As Rect
Dim r As Rect
r.Top = Top: r.Left = Left: r.Bottom = Bottom: r.Right = Right
CRect = r
End Function
Public Function PtInRect(Rect As Rect, x As Integer, y As Integer) As Boolean
If Rect.Left < x And Rect.Right > x And Rect.Top < y And Rect.Bottom > y Then
PtInRect = True
End If
End Function
Public Sub test()
Dim r(10) As Rect
r(1) = CRect(10, 10, 100, 100) '...
If PtInRect(r(1), 15, 180) Then
MsgBox "In Rect1"
End If
If PtInRect(CRect(10, 10, 100, 100), 15, 80) Then
MsgBox "In Rect2"
End If
End Sub
改行多すぎらしいので:で詰めて書いてる >>329
エクセルでCSV開いてシートをそのまま2次元配列に突っ込めば良いんじゃないか >>319
え?
そうなの?
それは知らなかった。
ちなみに最新はASP.netのcore2.1だと思うんだけど
VisualStudioでASP.Net Coreプロジェクトを作る際、
.Net Coreと.Net Freamworkのどちらのプラットフォームを選択するか聞いてくるけどあれは何なの? >>335
ASP.NET Core 3.0以降ではFull .NETが切り捨てられることが公式に明言されてる
3.0はまだPreviewだけどね Dimってどこに書いてますか?
全部最初に書きますか?
For i= 0 to 100
for j = 0 to 100
iとjを使った処理
next
next
この時、Dim j as Integer ってどこに書きますか?
「For i= 0 to 100」の上か下かという質問です。 定義は一番最初にまとめて全て書くと管理しやすい
個人的にはそもそも書かないけどな〜 >>330
自分でも調べてたけど、「最後の要素しか増やせない」って同じこと書いてありました。これは
例えば、行数読んだ結果がLcnt=10だとして
まず
ReDim(Lcnt,0)で作り
配列(0 to 10,0)ができ
Redim Preserve(Lcnt,Ubound(Split(1行目))
区切った値が5なら
配列(0 to 10,0to5)が出来てしまい、いっぺんに右の要素数が変更されるってことで合ってます?
と言うことは、1行目が5列で次に読んだ2行目が3列なら右の要素数は3に減るって事ですかね?
ifか何かで要素数は増える時だけRedim Preserveのが良いですかね? >>337
VBは上にまとめ
C#は使う時
他の言語はしらん。あくまでイメージ。
スコープは短くが理想だから長くなって下部に変数が初登場ならFunctionとかCallで余分そうなものは排除。
だからそのループも逃がす >>339
あなたの用途に合ってるのは2次元配列じゃなくて配列の配列。
ReDim arr(0 To n)
arr(i) = 別の配列 ` i : 0〜n
みたいなことができる
「別の配列」のところに、csvの一行分を処理して配列を返す関数を当てはめればいい。
もちろんクラス化してもいいけどさ >>329-334
Ruby では普通に、2次元配列に入る
require "csv"
p CSV.read( "test.csv" )
結果
[["id", "first name", "last name", "age"],
["1", "taro", "tanaka", "20"],
["2", "yumi", "adachi", "21"]] クラスって要素名を予め宣言しないといけないからcsvの要素が変わると対応できない?
教えてエロい人 要素名で名前解決する処理がないなら、レコード値を配列プロパティで受け渡すだけで良いと思う
名前解決が必要なら要素宣言しないといけないね 教えてください。
エクセルのマクロです
PDFファイル(100ページくらいある)を、エクセルに、全ページをたて一列に貼り付けたいのですが、
どう書けばいいでしょうか RPAを買ってコピペを自動化するのが手っ取り早いよ なぜPDFを貼り付けるのか
そのまま印刷すればええやん
そのPDFは1つのファイルの中に100ページあるの?
1ページだけのPDFファイルが100個あるの?
バラバラのPDFファイルを1つに結合したいだけならフリーウェアでできるよ >>347
印刷のためじゃなく、PDFをシートにはり、横にエクセルでコメント入れたい。 >>345
PDFを画像に分割→エクセルに貼り付け
って流れになる
PDFから直接どうこうは止めたほうが良い、PDFを触るのはかなりめんどくさい
PDFを画像に分割するソフトがあると思うから、まずはそれを探して試してみて
どういう形式で画像が出て来るかが分かれば、後はvba簡単に書けると思う
>>349
そういやそっちの方が早いね >>345
「教えてください」で始まる質問をするのは馬鹿しかいない法則 分割するとは?
100ページのドキュメントだから100個のファイルを作成するということでしょうか。 分割しないで、ページを読み込み、貼り付けはできないのでしょうか? PDFを画像にするっていうのはプリンタで印刷するのと同じイメージだから基本1ページ1ファイルね >>356
できるけどめんどくさいんだって。
自分用ですら>>350の手順踏む
この件は誰もやらんって断定するから諦めたほうが良い どうしてもVBAとExcel上でやりたかったら
100ページのPDFを100枚の画像に変換するのはフリーウェアで一発でできる
画像をワークシートに並べるだけならVBAで簡単に書ける
上司の命令とかで他の選択肢がないなら、俺ならこうする >>345
>エクセルのマクロです
なにがどうエクセルのマクロなのか全くわからなくて面白かった >>362>>364
エクセルのマクロだけでいけるとおもったんやろ
実際出来なくはないと思うけどすげーしんどいって事にまで気が回らなかったことは仕方ない 「○○したいんですけど教えて下さい」
「なんでそんなことしたいの?バカなの?」
何でこんな回答いちいちすんだろ
答えてくてウズウズしてる自称プロが自分のわからない質問来てカリカリしちゃってるのか? なんでそんなめんどくさいことするの?
〇〇でよくね?
とかよく見るけど、質問者が聞いてる事だけ教えればいいのにと思う。 >>366
大正解
vbaと実務の範囲を分かってない未熟者
>367
それを言うと
「〇〇はやりたくないんですw」
という回答が帰ってくるのがもう過去何度も QAに集中したいならteratailかstackoverflow.jpがオススメですよ 1ページ目が貼り付けられるけど、ページを指定できないのかな >>311
htmlに書かれているJavaScriptを実行したい時とか。 めんどくさいっていうか、AcrobatOLE使えないと無理じゃない?
Excelだけで完結できる手法あるの? >>367
質問者が気付いてない、知らないだけの場合もあるから 上司から言われてるだけというケースもあるだろうな。 手順固定で指示する糞上司っているよね
その手順がボトルネックになって糞の塊のようなツールが出来上がったりする >>373
ハンドアセンブルを覚える。
バイナリで書き出す。 >>376
組織はそれが普通。趣味で仕事やりますというわけには行かない 趣味で作り上げたとしても説明してレビュー受けないといけない。その労力って結構きついしいっそ言われたまま作り上げた方が精神的にラクね >>376
固定するのは百歩譲って良いんだけど説明も了解もなく決める人には困るね
より良い方法を提案する機会がないままルールとして決まってしまう マニュアル化できるレベルの仕事しかできないって自虐だろ 1.質問に回答する。
2.質問者から、「その場合だと〜が上手くいきません。」と返事。
3.その場合は〜すれば良いと回答する。
4.質問者から「それだと〜」...
5.2-4を何度か繰り返す。
6.質問者に「そもそも君はその処理で何をやりたいんだ?」と聞く。
7.質問者の返事を聞いて、結局質問者の設計が糞だったと知る。
8.1-7をを何度となく経験してると、質問を見た時に設計の糞さ加減がかなりの確度で予想できるようになる。
9.質問者の聞いてることだけ回答すると糞設計のせいでドツボに嵌まるので聞いてることだけ回答するのは辞めようという結論になる。
10.質問者は自分の糞設計に気付かないので、質問にだけ回答すれば良いのにと思う。 こうやって質問者をひとくくりで決めつけちゃうような視野が狭い人が一番の癌なんだよな
バカほどなんでも決めつけて単純化させようとする
勝手に単純化させた結論を赤の他人にいきなり押しつけるから当然理解されない
理解されないことを相手がバカだからと決めつけていきなり罵り出す
頭がおかしい人なのかな?と放置されると論破して黙らせたと思い込んで悦に浸り出す
そしてプロ回答者としての自信を増して増長して居座る 大抵の事務仕事は本来単純なことをわざわざ難しくして仕事を作っているだけなのは事実だね
VBAや最近だとRPAのような小手先の自動化ツールのは、本質的なプロセスの見直しに対するモチベーションを削いでいる面もある 営業はそれが売上に繋がってると信じてやまないので、
どうにもなんないのよ〜 >>384
お前が碌に回答したことが無い初心者なだけだろ。
いろんな所で回答してる奴らは皆同意する。 >>387
同意するわ
明らかに知識の乏しい初心者が妙に具体的に手段を特定して助けを求めてきた場合、
「そんなことはどうでもいいから目的を教えろ」と対応するのが最も確実で効果的で手っ取り早い >>383
>8.1-7をを何度となく経験してると、質問を見た時に設計の糞さ加減がかなりの確度で予想できるようになる。
この辺りになると回答でイライラする事が無くなるゾ プログラムって書き方って人それぞれ違うと思うけどみんな書き方どんな?
EXCELのセルデータをComboBoxに格納
メイン文
caii addcbo(FilePath,1,Me.cbo1)
caii addcbo(FilePath,5,Me.cbo2)
caii addcbo(FilePath,8,Me.cbo3)
Function addcbo(....)
※DAOでEXCEL開く
第2引数の列を下にループ
第3引数に空になるまで格納
End Function
てな感じのコードってどうなの?
俺は先に2次元配列でシート丸ごと持ってきてから入れてく感じにしたんだけど、ここにいる人達はどう書く? caiiってcallの事か
>>392が綺麗と思うけど、大抵>>391ぐらいで終わる >>391
おまえプロさんか?
まだプロさん予備軍やったら気いつけや
そこからプロさんに堕ちるんはあっちゅう間やで >>387
さすがプロ回答者の鏡
嫌なら別に回答者なんてやらなくてもいいんだよ?
質問者をひとくくりに見下すようなひねくれ者になってまでプロ回答者をやり続けてる目的ってなに?
こんなとこで他人を見下してなきゃ自尊心保てないとかそんな感じ? >>384
こうやって回答者をひとくくりで決めつけちゃうような視野が狭い人が一番の癌なんだよな
バカほどなんでも決めつけて単純化させようとする
勝手に単純化させた結論を赤の他人にいきなり押しつけるから当然理解されない
理解されないことを相手がバカだからと決めつけていきなり罵り出す
頭がおかしい人なのかな?と放置されると論破して黙らせたと思い込んで悦に浸り出す 質問に対する回答よりも糞みたいな煽り合いに熱中する奴ってなんなの 質問者は基本的に馬鹿
「インターネットは開くんですけどxxシステムが開きません」と言われてTraceやらブラウザ設定やらやった挙句、LANケーブルが挿さってないだけでインターネットはキャッシュでした、っていうようなオチが山ほどある
奴らの言葉を鵜呑みにしてはいけない ループから抜けるときにブレイクとかコンティニューないのこれ? >>400
exitがある
Sub foo()
For i = 1 To 1000
Debug.Print i
If i > 100 Then
Exit For
End If
Next
End Sub >>399←こいつホンマもんのプロさんやんwww
Traceてwwwwwwww 混沌とした質問ではなくてある程度整形された質問ならお互いに健全かもしれないね。
「例えば質問のためのテンプレ埋めてもらう」とかだけでもやり取りの回数減るんじゃないかな。
テンプレの内容はよくわからないけど、例えば「配列が解るか、オブジェクトが解るか、APIが解るか」とか書いてもらえれば質問者のレベルか解りやすいから罵ることもないだろうし
全体の流れの一部として困ってるのか、単純に言語仕様で困ってるのかだけでも質問者に必要なのがコンサルなのか解答なのか切り分けしやすいと思う。 【目的】
【何がわからないのか】
【どうなることを期待しているのか】
【何故それが必要だと考えたのか】
でいいよ
質問者のレベルなんてレスの内容見りゃわかるだろ >>405
>【目的】
>【何故それが必要だと考えたのか】
これは無くてもいいかも
多分あんまり良い情報は返ってこない気がする
>【何がわからないのか】
これも無くて良いかもしれないけど、
まぁ一応質問スレなので
後は最初の状態が欲しい
初めと終わりがあれば何とでもなる
それと反復頻度。一回だけなら一回だけ用の雑コードで済ますし、毎日ならもうちょい丁寧に書く
ってわけで以下になっていると楽
【作業前の状態】
【終了時の状態】
【何がわからないのか】
【作業の頻度(一回だけ or 何度も)】 データ量も欲しいなあ
1万件なら雑コード、100万件なら処理速度も意識してコード書く 質問者が減れば珍回答で恥をかくリスクも減って回答者のプライドが保たれるので問題ない まぁプロ回答者どもが罵り合いやってますが、質問者の方はそんなの気にせず
どんどん質問してくださいな w このスレの本質はプロ回答者選手権だからな
プロ回答者の敵はプロ回答者
質問者など餌に過ぎない
その餌を誰が一番上から踏み潰すかを競い合う
ちなみにプロ回答者にもなると質問に答えたりしない >>413
なるほど!
まさに>>413さんのような方ですね なるほど
プロ回答者ってのは「質問スレにおける回答活動」のプロって意味か まぁ別に目的の記述は無くてもいいけど
何を目的にしているかの記述があれば
代替案考えてくれる人もいるだろうし
欲しい解答が得られやすい場合もあるわな
逆に余計なこと言って欲しくないのなら
書かないのも有りだと思うけど
解答者がゲスパーして答えるのも
また有りだと思うし >>400
ループから抜けるのは>>401の人が言う通り
Exitを使えばいいけど、次のループに行くような
.Netで言うContinueはないので
分岐でループしているロジックの最後に持って行くしかないんじゃないかな? ここの質問を見ると、よほど変なもん作らされてるんだろうなって思う。
何に使うのかわからないようなのが多くて、
実務で使いそうなのがあまり出てこない。 実務では文字列解析とデータベースからの検索程度で難しくは無いんだけど
適当に組んだせいか妙に遅いのが悩み
高速化するテクニックとかないかな 二重Forループ
↓
VLOOKUP
↓
高速VLOOKUP
↓
SQL
これより速いのって、やっぱアセンブラ? >>422
インデックスを張ってSQLでJOIN
オンデマンドなトランザクションじゃなくて単発の巨大なバッチならHiveとか使うのもいい エラーがわかりにくいのがいちばんのストレス
そのほかにも可変長引数とかジェネリクスとかwithの糞文法とか短絡評価未搭載とかインターフェイスが歪んだ設計になるとか色々遅れすぎ
所詮底辺が一発ツールで使う言語 短絡評価がないせいでネストを深くせざるをえないときがあるんだよね >>425
その辺は仕方ない
C#やRubyやってる人がJavaは糞だって言ってるのと大差ない >>425
エラーチェックは本当にな
これでforが無いって言われる。本当にないのはもちろnendif
さすがにもう迷う事は無いけど、
初心者の頃は散々苦しめられた
Sub foo()
For i = 1 To 10
If True Then
Next
End Sub エラーってコードのエラーのことか
実行時のことかと思った あぁ、実行時エラーの可能性もあるか
あれはactiveにしてないsheetのcellをselectした時はハマったけどそれ以外は特に・・・ 唯一(?)の短絡評価である Select Case のリストはクソだと思いながらたまに使う >>433
お前がGoogleの採用選考を受けても学歴で足切りされて職務経歴の中身すら見てもらえないだろ?
結果が決まってるのに余計な評価をするのはリソースの無駄だからだ
そのように、評価が確定した時点で残りの評価を省いて結果を出す戦略を短絡評価という >>434
お前バカだな
Googleは学歴より経歴重視だよ >>436
低学歴にも凄い経歴の奴はいるが、高学歴の中にはもっと沢山いるんやで
採用のための人的リソース最適化問題に対する戦略として、学歴フィルタが有効であることは十分に証明されている >>437
履歴書と職務経歴書って同封して送られてくるんだから同時に見ればいいじゃん
それとも30秒くらいの時間を惜しんで職務経歴書読まずにお祈りするの?
大した戦略だねw >>438
学歴なら人が見る必要すらないでしょ
書類選考のコストは一桁違うかと >>438
たかが30秒と言う奴は10,000件あったら何時間かかるかを考えてからレスしろ Googleはそもそも学位が必要ない時点でお前らズレてんだよ >>400
ブレイクは >>401
Continueは、Nextの前に例えば CONTINUE:とラベル付けて、Goto CONTINUE で代替可。
これで何も過不足ないし、意図を読めないやつは(周りに)いないので、しょっちゅう使ってる。 goto使うと負けた気分になるけどネスト深くなるくらいなら使う 昔から言われてるけどGoToとかExitみたいな無条件ジャンプはできるだけ使うべきじゃない
ループから抜ける条件が複数ある時は、条件判定部分を関数にして外に出せばたいがい解決する >>449
3重構造のFor文とかって、いちいち全部のFor文に条件を書くんか? 下向き限定なら許す
バカみたいな脱出フラグ使われるよりよっぽどマシ
上向きgotoは死ね >>446
VBAにはなんでContinueがないんだろうな
これ、ほんとめちゃ不便だわ。 これのためにもgotoは使ってるわ。てか、必須になっている Forの3重構造の場合、例えば、i, j, kで回したとき、一番中の処理で、
i=10000
j=10000
k=10000
とか設定したら、全部抜けるという技は使ったことはあるが、Next k の次に処理があってNext jとかってなってるときは
やはりgoto を使うので、結局こういう技は使わなくなった for、特に二重ループから抜ける時はgotoで良い
if flg then exit for
こんなもん何個もあったら余計見づらいし間違う
>>449
気持ちはわかるけど、どうしても>>450になって余計に見づらい
>>45
20年前の言語で全く進化してないからな
python2.x→3.xの悪夢を見た者としてはこれはこれで良い Case (i) ⊇ Case (j) ⊇ Case (k)....っていう感じの線形の包含関係が無条件に成り立たない限り、3次元以上のループ管理はややこしくなるだけだよな >>429
それに苦しめられたのはお前が悪い。
きちんとインデントする自分なりのルールがあればそんなことには最初からならない。 三重のル―プで条件によって全部から抜けるって処理自体あんまり無いだろ。
設計が悪いんじゃないの? >>456
>それに苦しめられたのはお前が悪い。
どう見てもvbaのエラーチェックがしょぼすぎる
少なくとも>>429みたいなエラーチェックはあり得ない。あっても修正される
>>457
殆ど無いが、エクセルはそもそもがセルが行列の二次元+シートの三次元
開いてるブックを含めれば四次元だけど、さすがにこれは無い
全シートもあんまりないけどな
全セル(usedrange)に処理をかけて特定条件で抜けるというのは何度かあるな
ただまぁ別に抜けんでもそんあに変わらないというのもあるけど エラーがわかりにくいという話に
エラーを出すおまえが悪いとマウント取りに行くプロ回答者
マウントがとりたくてやってるのか本当にただのバカなのかどっちなんだろ まあでも多重ループから一気に抜ける方法がExit Function/Sub しかないんだから
ループを含む部分をサブルーチンとして切り出す以外あるまいよ ループを回す以上はループを回す理由があるはず
その理由をわかりやすい関数名にしてループを切り出す
途中で抜けたければExitする いや、doとfor組み合わせれば二重ループ、三重ループからも抜けれるよ。
実用性は置いといて。 >>454
N88さわってたからループからgotoするのは違和感あるわ >>459
ただのバカだと思うよ。
あの場合は明らかにエラーメッセージがおかしい。
でも、エラーチェックしてると2つ以上の原因(またはどちらかが間違い)が考えられる場合がよくある。
その時どうメッセージ出すかは、作る人(仕様)次第。
ちなみに、
If xxx Then Exit For
If xxx Then _
Exit For
If xxx Then
Exit For
End If
それぞれ意見はあるだろうが、無駄に行増やしたくないが、マルチステートメントもな… なので、自作では2番目をよく使う。(もちろん仕様で決まってるならそれ優先。賛否について議論はしない) いつまで経ってもほったらかしにされてるVBAが悪い
Pythonがどうたら言う話はどうなった >>464
最後の奴を使う。
インデントで明らか。
というか、そんなエラーを出すこと自体無い。
が、もちろんスタイルの問題だから一番最初の奴を使おうが2番目のを使おうが問題無い。
エラー出してもすぐに分かるならな。
ちなみにその最後の奴ならIfとEndIfを書いてからExit Forを書く。For Nextの場合も中身は後だ。
染み付いてるんでね。
別にそういう書き方をすべきと言ってるんじゃない。
エラーにすぐ気付くなら何も問題は無い。 VBAって遅い?
セルにもの入れると遅くなるって以外で全般的に。 >>469
遅い
どうしてもエクセルが枷になる
大規模な計算をしたいならvbaは避けたほうが無難 純粋な数値計算部分は遅くはないんだけどね
シートアクセスが遅いのはまあ >>469
ようするにVBの部分の話か?
変数の大ニュースとかループとか、配列のメモリ確保とか 確かに遅いんだけど、遅いと言ってる奴の大半はそいつのコードに問題があるような気がする。
コード変えたら100倍速くなったとかざらだし、VBAが遅いせいでと感じることは殆ど無い。
遅い場合でも処理を考えたら仕方ないと思える場合が殆ど。 >>471
純粋な数値計算部分が遅いと思うよ。
だからAPI使ってマルチスレッドのコード書いても処理が追い付かなくなる危険性があるわけで。
ただ、そんなの遅いと感じるようなものじゃないし、遅さが気になったら自分のコ―ドを疑った方が良い。 裏で動かせるなら、処理遅くても他の作業してればエエねん。
終わったら、アイコン点滅して教えてくれればエエねん。 javascriptとvbaをネストする方法ってありませんか?
Dim ie As InternetExplorer
Set ie = CreateObject("InternetExplorer.Application")
ie.navigate ("https://kakaku.com/specsearch/0010/")
中略
ie.navigate "javascript:var i; for(i=1;i<18;i++){page(i);}"
これで1から18までpage関数をまわすことができると思いますが
1ページごとに情報を抜き出すための処理をvbaで書きたいです。
対象のwebページはjapvascriptのpage関数を使ってしかページ移動ができません。
ちなみに対象ページは↓です
https://kakaku.com/specsearch/0010/ >>476
kakaku.comなら「この検索結果を友達に知らせる」から直リンの情報が得られて、そこにページ番号も書かれてるからVBAだけで全データを取得できる javascriptでページ情報を適当な外部ファイルにダンプして後でvbaでまとめて読み込めば良いだけでは? 変なページはキーボードマクロでやったほうが手っ取り早い場合も >>477
こんな方法があったんですね!
ありがとうございます
getの形で見ることができるんですね
これならfor文でまわせそうです
>>478
javascriptの知識がvbaの知識より薄くてできません・・・
>>479
その方法もありですね
勉強になります
ありがとうございます for i = 0 to 10
ie.navigate "javascript: page(" & i & ")"
vba_code_here()
next >>481
これでもいけますね!
ありがとうございます
自分でも試してたつもりだったんですが&の端がシングルクオーテーションだったからだめだったんだと思います。
これでもネストできそうです。ありがとうございます。 フォームに張り付けたMediaPlayerプレイヤーのコントロールのプロパティが勝手に変わる謎のエラーが頻発。
どうもフォームのサイズを変更するAPIがイタズラしているらしい。
こまかく切っていってようやくまさかの原因が解ったが対処方法わからずに対処療法してしまったがそれでも半日あまりを費やした。
よくわからないサンプルコード使うと謎のエラーが出てハマることを覚えた。
プログラマーってすごいな、これ毎日やってたらほんと禿げるわ。 >>483
>よくわからないサンプルコード使うと謎のエラーが出てハマることを覚えた。
これやると一番時間を無駄にする
・サンプルコードをざっと眺めて全体の流れを把握
・APIの仕様をしっかり読む
・一からテストコードを書く
・APIもう一回読み直しながら、もう少し詳細に作り直し
・本番環境で書く
こんな感じ。仕様を把握してから書いたほうが絶対に早い >>448
オーバーロードってあったっけ?それに、ジェネリクスがないから全部の定義されてる型について生成しなきゃいけないから地獄なんだよ!リテラルで配列を生成できたらいちいちDimしなくてもいい ちなみに、望むシグニチャーはこんな感じ
' T = Generic
Public Function ArrayOf(/* vararg */ element As T) As Array<T>
どうせVBAは浮世離れしすぎてて書けないけどな! ジェネリックはないがヴァリアント型つかえば良いのだよ
無いものねだりしてもしょうがない
問題解決のためにあるものを使うだけ >>429
これ。面白いな。試していないが、頭から見て行ってまずForが出て来るのにForがないって言われるの?w
VBAも構文を修正するのはいろいろと問題があるだろうけど、こういうペリフェラルな部分では改良できるところは
いくらでも残ってるよねえ 構文チェックくらいなら、どっかサードパーティが作ってアドオンとか出来ないのかな
xlsファイルの中からプログラム文ってテキスト抽出って出来ないんだっけ >>488
If〜Thenでブロック作るからNext出て来たらForがないと見なされる
C言語とかはEnd IfとNextの両方が } なので発生しないけどイメージとしては
for(i = 0; i <= 10; i++)
if(true){
next
}
みたいな感じになってる >>489
やれるやれないという意味ならやれる
そもそも*.basとか*.clsとかにエクスポートしたらテキストファイルだし
セキュリティの設定はいるけどCOM経由ならそんなに難しくない
ただ>>429みたいなケースでわかりやすいメッセージを出すのは思ったより難しい >>487の言うとおりだ
生成もジェネリックに出来ないが使う方の関数だってジェネリックは出来ない。
つまりVariant を避けてると型別定義地獄になるって事だ >>476-482
wget は簡易クローラーだから、これで複数ページをダウンロードすれば?
その後、vba で処理すれば?
まあ、適度に時間をおきながら、アクセスしなよ。
頻繁にアクセスすると、営業妨害で逮捕されるかも win10(64bit)にoffice2013(32)入れたら動作おかしくなったので
新しいoffice買ってきた bitsadmin.exeやPowerShellを使う手もあるな Variantか…型安全をぶち壊してる気がするけど… >>496
いいんだよ
型安全な汎用プログラムを書けない時点で、個別のプログラムを型安全にする気は失せるというものだ >>493
有料のRPAツールを使ってもダメなんでしょうか? 暗黙の型変換が拡大縮小の両方に効く時点で型安全なんてあり得ないわけで vbaで型安全ってなんのギャグだよ
Sub foo()
Dim bar As Long
bar = 1 & "0"
msgbox bar
End Sub >>500
これって 1 & "0" のところが 1 + 0 と評価されて出力が 1 になるのか? 数値を“”で括って連結させるって普通はやらないよな
もはやクレーマーの域 >>501
ならない。
---------------------------
Microsoft Excel
---------------------------
10
---------------------------
OK
--------------------------- >>505
本当、馬鹿は食いつきがいいな。エラーも起こさずに動くのが問題なんだよ。
馬鹿には難しいか? &演算子が勝手に文字列に変換するのは利便性考えたらわかるし
Long型の変数に文字列代入する時に暗黙のキャストするのもわからなくはない
けど警告ぐらいは出してほしいね >>506
それはエラーであってほしいというお前の願望だろ VBAにも当然、厳密な構文ルールは存在するだろう
数字 & 文字列は文字列にするってのがルールじゃね。 一度覚えたらそれでいい >>497
Variantは意識して使う。
型安全も意識する。
当然、暗黙の型変換でどうなるのかも意識して組んでいれば、そうそう問題になることもあるまい。 どんな言語でもツボは有るわけでね。
押さえてコードを書けない奴がアホなだけだろ。
初めて触った初心者じゃあるまいし警告なんて全く必要無い。 同じマクロを使っている複数の文書があって、マクロの一部を修正したいんですが、
別ファイルのモジュール内の変更を行うマクロは VBA を使って書けますか?
または、別ファイルのモジュールを削除(開放)してインポートする形でも構いません。
実際はワードでやりたいことですがワードVBAスレがなさそうなのでこちらで質問しました。
Normal を書き換えて対応するというのはできない前提です。 >>514
スレ一覧よく見てみろ。そういういい加減で他人にすぐ聞くからできないことだらけなんだよ。 >>503
Option Explicit付けてもエラーにならないのかな? >>510
お前は何を言ってるんだ?
& は文字の連結子だろ。 だから、文字としての1と0を連結したんだよ
>>513
代入先は数値だな。 文字処理をしてそれがVariantだからそれから数値変換したんだな
文字処理が優先なんだろ >それがVariantだから
すまん。これはなし
まあ変な構文ではある >>519
だから連結じゃなく加算と解釈されたらたまったもんじゃない
と言っている >>507
& 演算子は文字列同士の連結だから
2 & 1 ⇒ "21"
"2" & 1 ⇒ "21"
2 & "1" ⇒ "21"
"2" & "1" ⇒ "21"
になる
逆に - 演算子は数値同士の引き算だから
2 - 1 ⇒ 1
"2" - 1 ⇒ 1
2 - "1" ⇒ 1
"2" & "1" ⇒ 1
になる
問題は + 演算子で普通は数値の足し算なんだけど両辺が文字列の時は文字列連結になるので
2 + 1 ⇒ 3
"2" + 1 ⇒ 3
2 + "1" ⇒ 3
"2" + "1" ⇒ "21"
になる
なのでVariant使っててA + Bとかやってると両方が文字列の時にはあ?ってなことになったりする >>522
>"2" + "1" ⇒ "21"
&、-と合わせて考えるとめちゃくちゃ気持ち悪いなこれ 出力する時以外に文字列と他の型を演算させる需要ってあるか?
すごい変なプログラム書いてそう >>524
Cells(1,1) + Cells(1,2)
とか気軽に書いて文字列セルなのに気づかず発狂するがいい >>525
セルの値同士の計算をダイレクトにやろうとする発想にまず疑問を感じる だから、型を意識してコード書かない奴は駄目なんだ。
あと、Cells(1,1) + Cells(1,2)じゃなくて、Cells(1,1).Value + Cells(1,2).Valueとすべき。 >>524
セル値が16進で、その値で計算させるとかかな。
昔はよく使ってたが、最近は使わなくなったな… >>527
いや、そこじゃない
cellsのデフォルトプロパティがvalueな事ぐらい皆分かっている
valueの型がヤバイんだ >>527
> だから、型を意識してコード書かない奴は駄目なんだ。
そんなのわかってるからいちいちマウント取りに来なくていいよ
世の中には変数宣言すらしないやつとかもいるし使い捨てコードとかもある 本当によくできたプログラムっていうのは変数がどんどん減っていくものだよ >>532
と罵りたいだけが為にここに来るんだろ? プ まあやっぱり、1 & "0" とか "2" + 1
とかが出てきたら、エラーで落とすのが普通だろうなあ
で、プログラマはそこで、Val関数で数値にするとか逆に文字列にするとか
やっぱり型変換、確認をプログラムの中に入れながら作るのが本来の筋だと思うわ
そもそもの構文を変えないのであればね 質問です。お願いします。
public sub shuukei()
'集計してシートに書き出してそそのシートのコピーを別ファイルとして保存
end sub
↑
こういうコードを作りましたが、少しでも速く処理されるようにもっと工夫したいと思っています。
そこで、少し書き直しては速度に変化があるか確認したいのですが、コードの実行速度を
測る方法がわかりません。教えていただけないでしょうか?
public sub jikantest()
'計測スタート
call shuukei
'計測終り
msgbox かかった時間
end sub
↑
こんな感じでいちいち確認したいです。 >>540
dim st as single, ed as single
st = timer
(処理)
ed = timer
debug.print ed - st & "sec"
いつもこんな感じでやってる。 変数の型はトレースの時だけでもシンタックスハイライトして欲しい。
それか左辺に合うように強制キャストで。 >>540
早くなってもわかりにくいのはやんない方がいいぞ お恥ずかしい質問ですが、もうひとつお願いします。
私は、変数の中身でもなんでも、とにかく確認したいときはmsgboxを使うんです。
そのほうが楽だし。
でも、こういう場所で回答するような人のほとんどは、>>541-542さんのように、
debug.なんとか ってのを使いますよね?
よくわからないけど、debugって、msgboxとは違って、どこかのウィンドウに表示させるってことだけ
は知っています。
そして、msgboxよりも、そっちの方がなんとなく本格派っぽいことも感じてます。
みなさん、どうしてmsgboxよりそっちを使うんですか?本当にそっちが便利なんですか? >>546
msgboxだと毎回画面が出ちゃうから Debugって俺も使ったことないんだが、過去何行くらいまで遡れるの?
それとその結果ってファイルに出力できる? >>546
OK押すのメンドいし、押したら消えるし。
Printならイミディエイトウィンドウにどんどん溜まっていくから比較しやすいし。
VBE上でCtrl+Gで呼び出せる。
コード書くときは常に表示してるな。
他にもいろいろ便利に使えるからGGってみて。 debug.printなら開発画面を見ない他の使用者が
気付かないで済む >>540
ちょっと本格的にやるなら…
https://blogs.yahoo.co.jp/yangzh_jp/26557113.html
注意!
中にも書いてあるけど使用時にコードを改変するから使うならバックアップはちゃんと取ること >>531
そうとも限らない。
速度の為に変数増やすこともあるから >>548
そんなに大量には残らないね。
1000行くらいか?
大量に残したいときは普通テキストファイルに書き出すだろ。 >>553
まああくまで傾向だな
システム開発に絶対はないから大まかに語るしかない
しかしまあプログラマって柔軟性がないから何か意見を言ったら必ず特殊な状況を想定して反論しようとする人が出てきて面倒くさいな >>555
後々のテスト工程考えてるからじゃない?
そこまで考慮しなくても…となる気持ちは分かる 考慮すべき場面とするべきでない、しても意味がない場面の判断ができないとも言える 想定される状況なんか結局は本人にしか分からないし、説明すんのもめんどくさい
まあ本人が気付いてないこともあるけど >>555
決めつけで語って指摘されたら逆ギレかよ w ーーここまで型変換関数なしーー
身内が意味がわかるっていうなら変換関数抜きにしてもいいかもしれない、けどコンテキスト的に関数噛ませたい >>564
いやいやいやいや
ByRef As Variant
の意味論がわかってないだろ Variant型がないとそれはそれで不便
実行時にならないと変数の保持データの参照型やデータ構造が決定できないような関数を定義するときには必須
Object型では限界があるし、多態性とか考えたら特に VBAにもInterfaceがあるの知らない人かな だから意識して使うぶんには良いんだよ。
Variant配列で高速化は良くやるだろ。
あるいはあえていろんな型を受け付ける関数を作る場合とか。
俺はInteraceはあまり使わんね。
同じプロパティを持ったクラスを複数作ってグループとして使う場合でもそこまでしなくて良いだろと考える。 プログラムの基本的な良い習慣を実践すればVariantなんてそう使うことはない
使うとしてもシートIOなど僅かな用途だけだから業務ロジックまで影響することはまずない プロ雑談者どものくだらん蘊蓄語り合いなんぞどうでも良いから質問者の方々は
遠慮なさらずにどうぞ〜 コードって色々書く場所あると思うんですけど、ある程度共通の切り分けってあるんですか?
フォームにはあまりややこしいものはかかないで標準モジュールを使うとか。
逆にフォームで書けるものは複雑でもそこで終わらせたほうがいいとか。
今迷ってるのはシート1のデータを加工してシート2のデータにマージさせる場合どこに書けばいいんだろうってことです。
そのシートごとに別けるとバラけて解りにくくなるしみたいな感じです。 所詮VBAだしどうでもいいよ
VBAの可読性・保守性を高める唯一の指針があるとしたら、極力VBAを書かないでワークシートの機能を活用することかな >>571
標準モジュールに Sub MergeSheet1To2 とか作ってCallすれば、他人が処理部を見なくても「このボタンを押すとマージされるんだなぁ」と想像ができる。
自分はフォーム内は処理に使うデータのチェックくらいにしてる。 フォームモジュールって細々としたイベントのプロシージャであふれちゃって見にくい
だからできるだけ標準モジュールに切り分けてる
例えばフォーム上の複数のTextBoxに全く同じ入力規則を設けたい時なんかは
TextBox・KeyCode・Shiftを引数とするプロシージャを標準モジュールに書いて使い回ししてる
さっきもそういうの書いてた >>571
シート1 IOクラス
シート2 IOクラス
コンバータークラス
マージサービスクラス >>571
そのフォームで完結させたい時はフォームに全部書く。
汎用的なのは標準モジュール、汎用的でなくてもいろんな所から使い回す場合も標準モジュールだな。
シートモジュールにはシートのイベントプロシージャ以外書かないのが基本だけどそのシートのイベントプロシージャと一緒にしたい理由でシートモジュールに書くこともある。
意味論というか、何処に書くかは内容で決める。その方が後でコード見る時に視認性も良くなる。 シート1だけでしか使わない関数はシート1
その関数の中で使う関数で他でも使う汎用関数は標準モジュール
シート1のデータを加工ってあるが、それが将来にでも他のシートでも使いそうならその加工関数は汎用化して
標準モジュール。 シート1でしか使わないのならその加工関数はシート1に書く 上級者の人がどう使っているかなんとなく解ったような気がします。とりあえず
【クラスモジュール】汎用性のある関数
【標準モジュール】 大きな処理
【シートモジュール】【フォーム】極力使わないが他と絡まない短いコードなら完結しても良い
という感じで試してみようと思います。
あとは関数名の最後に呼び出しする関数がある場所を付けてみようと思います。
何をやりたいかで構成も変わると思うのでそこらへんも加味しながら試してみます。
参考になりました、ありがとうございます! また一人、道に迷ってしまった
やっぱりVBAで勉強するのは非推奨ダナ >>546
俺もmsgbox。
イミデは、知らないうちにウインドウが消えちゃうから。
プロパティもそう。
何で勝手に消えるんだろ。 >>579
汎用性のある関数を記載する場所だけど、VBAの仕様ではクラスモジュールではなく標準モジュールの方が都合が良いよ
何故なら自作のクラスモジュールに記述した関数を呼び出す場合、その自作クラスのオブジェクトのインスタンスを生成した後にそのオブジェクトのメソッドとして書くという手間が要る
つまりマシンメメモリの無駄食いになるしコーディング量も増える
標準モジュールならば関数名を書くだけで呼べるので余程気楽
適当にググったときに出てくる、OOP原理主義のJavaプログラマあたりが言うところの「汎用性のある関数はクラスに」っていう考え方は、VBAには当てはまらないので注意だよ >>572
ワークシートなんて可読性最悪じゃん
セルには数式が1つしか書けないし条件付き書式も内容を確認するのが面倒
条件付き書式が設定されてる範囲を視覚化する方法ってないよな?俺が知らないだけ? >>572
>>585
可読性を高める唯一の方針とは言わんが、正直下手に変数にブックレベル以上の参照スコープを持たせて値やオブジェクトを操作するくらいならワークシートの機能を使った方がよくねって場面はいくらでもあるな
エラーとかでプログラムが停止したときにセル値と違って変数に格納された参照ポインタは揮発するし ワークシート関数の何が良いかというと副作用がないことだよ
ぶっちゃけ重要なのはそこだけ
それ以外ではセル内にだらだら式を書くと醜いなどデメリットしかない
なのでVBAで普通に副作用がない関数を書けばいい
副作用のない関数ならVBAからもセル内式からも使いやすい
しかもセル内式と違って見やすく管理しやすい VBAの方が見やすくて管理しやすくてワークシート関数は見にくいって図式が成り立つかどうかは正直処理を書くやつのスキル次第だけどな
ワークシート関数は必ず内部スコープが()で括られるリスト形式だから、処理構造が簡潔に可視化できるメリットがあるとも言えるわけだし 自分は>>572とほぼ正反対のやり方でやってきた
シートは使い捨てのデータとちょっとした設定情報を置いたり、あとは結果を出力する場所としてしか使わないな。
使い捨てのは別だけど、ツールとして繰り返し使うブックのシートに関数はほぼ書いてない。 >>589
セル内数式はネスト入るとすぐに醜くなるじゃん
それに式に名前をつけて管理できないのもメンテナンス性を悪化させてる >>591
式に名前を付けたければ単一値ならセルに名前付けりゃいいし、ベクトルならテーブルにしてカラム名付けりゃいい
VBAで関数自作してもいい
VBAの中でループぶん回すよりは遥かに見通し良いわ >>592
そもそもセル名前自体が管理しにくいので論外
セル名と数式の関係性がパッと見てわからないし
セル名と数式がひも付けられて管理されてると言われなきゃ後任が気付かない
VBA関数ならこの関数名はこの定義って誰でも一目でわかる
本来の出力でない余計なカラムはノイズになって邪魔
名前で管理したい項目が増えたらノイズだらけになってなにを説明したい表なのかわからなくなる visual studioに慣れ切ってしまってるのでVBAエディタがマジで苦手・・・ >>593
VBAでワークシート関数を作るのは否定しないよ
最悪なのはワークシート関数(VBA含む)でできることをVBA内でループ回す馬鹿 >>595
こ文脈でループを回すの意味がわからないしどっから出てきて何を意味してるんだ? 話変わるがセルのコピーとか移動したときに条件付き書式が壊れてやたら重くなって直すの苦労したことある お前らまず、
ワークシートの機能を活用する
というのをどういうことかちゃんと合わせてから話してくれるか >>598
ワークシートの機能ってのはワークシートの機能一般のことでしかないだろ
ワークシートの特定の機能を想定して話をしてるんじゃない
ワークシートの機能を使えば事足りる処理をわざわざVBAのスクラッチでやろうとするのは車輪の再発明の極みだという話 ワークシートって言いすぎww
Withでまとめたくなってきたわ。 With ワークシート
.の機能ってのは
.の機能一般のことでしかないだろ
.の特定の機能を想定して話をしてるんじゃない
.の機能を使えば事足りる処理をわざわざVBAのスクラッチでやろうとするのは車輪の再発明の極みだという話
End With ワークシートの機能って単独のワークシート関数で実現できることなの?
それをVBAでやるのは確かに馬鹿らしい。
そうじゃないならVBAのほうがいいな。 >599
だからワークシートの機能一般ってなんのことを言ってるの?
セルの計算式?
計算式用のワークシート関数?
Application.WorksheetFunction? VBA以外のExcelで出来ること全てだろ
理解力低過ぎないか? なんでVBAを外すのか分からない
このスレにいる連中ならワークシートにはイベントも含まれるという感覚の方が普通でしょ シートを方眼紙だと思っている人の視点での機能一般だろう。
ここの人たちは、クラスモジュールの1つくらいの感覚かもしれんが。 EXCELの全ての機能のうちVBAを除いた残りってことじゃね エクセルのオブジェクトモデルでメソッドが提供されてるような機能をわざわざVBAでスクラッチするなって意味もあるんじゃね
ListObjectオブジェクト(テーブル)の存在や機能を知らずに、同一列内のセル数式ほコピーの機能を自作するような話だろ 初心者です。わかる方いましたらお教えください。
IE.Visible = False
として、
IE.Quitが何らかの理由で実行されなかったり、それを書かなかった場合
どうなってしまうんでしょうか…?
バックグラウンドでずっとフワフワといるんでしょうか?
見方もよくわからないタスクマネージャーで見てみるとアプリケーションとしてはたぶん起動されていませんでした…
IE.Visible = Falseとした場合はもしかして特に閉じる指示が必要ないのでしょうか…? >>610
バックグラウンドでずっと動き続ける、が正解
ちゃんと起動してないのはコードがおかしいかタスクマネージャの見方がおかしい
そこをTrueに変えるだけでちゃんとIEのウィンドウが表示されるか確認 >>611
Trueに変えるだけで表示はされたので、タスクマネージャーの見方がおかしかったようです
ちゃんとバックグラウンドなんとかの欄では起動されていました
ありがとうございました… 関数使うかVBA使うかも内容で決める。
関数だと物凄く重くなることがある。
Sumproductとかを多用した場合とか、複数シートの集計を1日の集計としてさらに1ヶ月分の集計するとか。
自動計算を切れば良いんだけど、運用で微妙だね。
それに昔、銀行の仕事で大量のデ―タとSumproductのせいで1回の計算でさえいつまでたっても終わらないことがあった。
その時はVBAに書いたら5秒で終わった。 ワークシート関数を関数と表現するのってUSBメモリをUSBと呼ぶのと同様にアレな感じ WorksheetFunctionプロパティで呼ぶもの(sumとかvlookupとか)がワークシート関数
VBAでしか使えないもの(CIntとかInstrとか)がVBA関数
上記と自作関数をまとめて関数 >VBA関数
標準関数だろう
エクセルの場合はVBA標準関数とでも言うべきか
>自作関数
ユーザー定義関数という名称がある
まぁ俺は関数としか呼ばんけどな、ハハハ
vbaでワークシート関数使う時はそう呼ぶ 関数とVBAと対比させてるのに勘違いする奴がいるとはとても思えないが。
いたらそいつはアホだよ。 vbaだし何でもええやろ
どうせ大事に至ることはない、争う程の事ではない >>621
馬鹿はVBAに関数がないと思っているのか?
馬鹿は早く死ねよ 「文脈上USBメモリのことであるとわかるときはUSBでいい」
「そもそもそんな呼び方普段からするなよ」 わかるかどうか判断するのは読み手側だからな
書く側が勝手に略すのは読ませる気がないんだろう そういえばCD-ROM2をロムって呼んでたやついたな
これSUPER CD-ROM2だから ID:TvaJY4yu0みたいな馬鹿がメンテできなくなるVBAを作る >>628
見てきたけど、なんかすげえめんどくさそう。出来ることも見新しいことってほとんどないじゃん
普通のWin32APIとかやったことあるのか。そっち勉強した方が遥かにまし。 VBAでもやれるから いやMacとかOffice Onlineで使えることに意味があるんだろ
まあOffice Online使うくらいならGSuite使うという企業が殆どだろうけどw >>628
はこういう事だった
誰も使ってないのね
https://qiita.com/y__na_ka_ya_ma/items/2575e79248978ff7828d
>>629
自己紹介乙
>>630-631
もちろんやれることは同じ
jsで書ける事自体がメリット
googleSpreadsheetのマクロを移植する時に使える
一生に一回もないと思うけどな Win32APIとOffice JavaScriptAPIどっちを勧めるかと聞かれたら今なら後者かな
後者の案件あるのか知らんが >>623
日本語が理解出来ないようだな。
VBAと関数を対比させているんだからここで関数と言ってるのは"VBAの関数"のことでは無いと解釈するのがまともな日本人だ。
>>624
???
それは日本語として変だ。
USBメモリはUSBでは無い。
VBAの関数は関数ではある。
そもそもの例が適当でないわけだ。
>>625
文脈や、やり取りでVBAの関数なのかワークシート関数なのかを判断する必要があるのは>>66、>>142、>>172も一緒だ。
お前らと違って普通の日本人は文脈ややり取りから判断出来てるんだよ。
>>614のようなことを言い出すのはお前らのような頓珍漢な奴らだけだよ。 >>634
正にその通り。
Win32APIではじめて出来ることがjsで出来るなら分かるけどね。 >>634
あぁやっぱりそうだよね
知識不足かと思って調べてしまったわ ID:bZMGULjeF
マジモンのアスペルガーのキチガイ jsアドインもう少しぐらい使われてるのかと思ったけど、
誰も使ってないようで安心した Excel Python API とかも Excel.js Office.js とかと同じ扱いになる悪寒 >>641
ゲェッ
vbaはこの手軽さが最強の武器なのに、VSからアドイン作成とかあまりに残念すぎる 会社で異動になった人が作ったマクロの稀に出るバグを直そうと頑張っています。
ちょっと怪しいかなと思ったプロシージャがあるので見にくく長いと思うのですが見て頂けませんか?
勉強しながらの初心者です。
Sub wait(IE As InternetExplorer)
Const リトライ = 2
Dim IEDOC As HTMLDocument
Dim ReCount As Long,i As Long
Do
«略»
Set IEDOC = IE.Document
«略»
Loop While IEDOC Is Nothing
If IEDOC.frames.Length < リトライ Then
ReCount = リトライ
Else
ReCount = IEDOC.frames.Length
End If
For i = 0 To ReCount
Do While IE.Busy Or IE.readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Next
End Sub
このあとすぐに書き込みに参ります オレンジの部分がIE.Busy = Trueという風に教科書通りになっていないのですがこれで大丈夫なのでしょうか
上手いことちゃんとなっているか調べようとやってみましたが私には難しかったです
そして水色の部分なのですが、フレーム数を取得してその数だけ念の為回しておくという感じでしょうか
フレームがいくつかあると取得のたびにIE.BusyがTrue,Falseに切り替わると聞いたのでそのためで合っていますか
それよりもさっき調べて出てきた
'完全にドキュメントが読み込まれるまで待機する
Do Until IE.document.ReadyState = "complete"
DoEvents
Loop
ではダメなのでしょうか、別物でしょうか
ざっとみておかしい部分はありますか?
図々しくすみません
https://i.imgur.com/DQxGNB5.jpg どういうマクロかと言うと、IEを開いてリンクボタンをいくつか押して文字を引っ張ってきてIEを閉じるというのを何度か繰り返すものです。
リンク先を正しく閉じられていないまま次の回転に入っていることが稀にあるのです >>646
別物だな
>>646はvbaオブジェクトのプロパティ
WebBrowserControl.ReadyState
https://docs.microsoft.com/ja-jp/office/vba/api/access.webbrowsercontrol.readystate
>>647はwebのapi
Document.readyState
https://developer.mozilla.org/ja/docs/Web/API/Document/readyState
どっちが信用できるかは分からない
どちらにしてもIEオブジェクトがどこまでwebの技術に対応してるか分からない。難しい
かなり雑な解決策としては、
>リンク先を正しく閉じられていないまま次の回転に入っている
とりあえず必ず開いていると仮定して、最初に閉じる処理を噛ませばいいだけな気もする
あと個人的にだけど、untilはあんまり好きじゃない。「否定の否定」が出て来ないように注意した方が良い。あれは読みづらくなる
とりあえず応急処置として、併用してみてはどうかな。うまくいくかどうかはわからない
Do While IE.Busy Or _
IE.readyState <> READYSTATE_COMPLETE Or _
IE.document.readyState <> "complete"
DoEvents
Loop IE11からreadystateもbusyも使えなくなったとかどこかで見た
利用出来ないという意味ではなくて使い物にならないという意味で
なので移動後に表示されるタブ見つけたら、とか移動後に表示される文字列を見つけたらという条件で対処してるわ >>646
・ IE.Busy = Trueという風に教科書通りになっていない
「if A then B」自体が既に「AがTrueならB」っていう意味だから、更に「= True」は冗長
・ フレーム数を取得してその数だけ念の為回しておくという感じでしょうか
作者はそのつもりだったんだろうけど、Whileの条件が真になった瞬間に全ループが終わるだろうから無意味
その後何かがFalseになってもEnd Subになる
・完全にドキュメントが読み込まれるまで待機する
偶にIEの受信が終わってもDocumentが読み込み終わってない時があるから、付けたほうがいい
フレームの件も、フレーム毎にdocument.ReadyStateを待つことで解決できる(ことが多い)
>>649
VBAは短絡評価出来ないから、IE.documentが取得できないとreadyStateプロパティが見れずに参照エラーが起きるよ
先にIEを待ってから、安全策としてdocument.readyStateも確認すると安定してDOMが使える csvを読み込む手法はいくつかありますが以下のような場合どの方法が最適でしょうか
1行1レコードになっていない(セル内改行あり)
csvが複数ありそれをすべて読み込んで集計処理がしたい
普段はデータインポートやopenで1行づつ読み込んでいましたが1行≠1レコードだと難しいのかと考えています >>649
長文でわかりにくい環境にも関わらず教えて下さってありがとうございます
参考にして、これから開きたいリンク先のウィンドウタイトルと同じタイトルを持ったウィンドウがすでにあれば閉じるという風に書いてみます
下の方に書いてくれたコードも試してみます
本当にありがとうございました
また下らない質問者したらすみません
>>650
会社のパソコンが古いのでしばらくは大丈夫そうです
ですが重要なことなので覚えておきますありがとうございます >>655
既存のウインドウを触るのは初心者にとっては結構大事だよ
閉じれてないのはQuitメソッドの前に次の処理が入ってしまってるだけだと思うから、
処理が終わったと思われる場所に自分でコードを挿入したらどうだろう >>654
改行が含まれてるセルは""で括られてるという認識でいいなら、
丸ごと文字列として読み込んだ後に正規表現で""内の改行を全部改行コードに書き換えるのが良いと思う >>657訂正
改行を全部改行コードに書き換える
↓
改行コードを全部書き換える >>657
試してないので想像ですが1ファイル数mb程あるので一括読み込みで取得出来るんでしょうか…?
変数に入るのか、pc動作的にどうなのかが気になりますが…一度試してみます >>654
replace(str,vbcrlf,"うんこ") >>659
文字列型に格納すればいいと思います
確か数Gbぐらい格納できたはず IEってBusy以外にステータスも見てないとループ抜けちゃわなかったっけ 両方見てても抜ける時が有る。
滅多に無いけど。
例えばClickで遷移する場合に、抜けてからBusyになることがあった。
Submitに比べてClickは単純に文字通りClickするだけなので遷移しないページも有るから必ずBusyになると想定されていないと想像してる。
それ以降Clickの時は最初にSleepを入れるようにしてる。 >>654
別に方法は色々あると思うけど1行ずつ読み込んでも良いんじゃない?
1行ずつでも条件に合うまで1レコードとしなければ良い。
1レコードの最後にも改行は有るんだろ。
もし1行ずつ読むなら1レコード内に複数改行が有る可能性を考慮すること。 >>654
Ruby では、列をダブルクオートで囲むと、その中にカンマや改行を含める事もできる。
他の仕様も含め、詳しくはRFC4180を参照
require 'csv'
p CSV.parse_line( "a,\"あ\nい\"" )
# => ["a", "あ\nい"]
\n は改行
列区切りはカンマで、外側の"〜" は文字列を表すための囲み。
内側の\"〜\" は、"〜"内での"〜"を表すため、\ でエスケープしている。列囲みを表す
a の部分は、\"〜\"で囲まなくてもよい rubyって・・・
もう完全に終わってる言語なんだからそんなもの勧めないでよ 下記リンク先のページ下部にあるユーザ定義関数がVBAとして正しく書けてるかチェックして貰えませんか
https://peltiertech.com/loess-smoothing-in-excel/ >>669
どういう計算をしてるかは知らんけど、コード上は問題ない 多分スレチだろうと思いますが、>>669をLibreoffice最新版に実装したところ戻り値に=LOESS(x,y,z,n)で指定したyの配列がそのまま表示されたのでコードどこか間違ってるか仕様変更したのを俺が見落としてるのかなと思って聞きました
ありがとうございました 指定した列以外の列を削除する方法を模索しています。
たとえば、ABCDE列の1行目にそれぞれ
あ い う え お
と入っていて、
"あ"と"う"と"お"以外の列を削除し、
あ う お
というよにしたく、
このようなプログラミングをしたのですが意図するように動作しません。
ド素人と罵られること承知で質問に参りました。
論理式自体考え方がおかしいものとも思っています。
どなたかお力添えいただけないでしょうか?
Sub 不要列削除()
Dim i As Long
For i = 1 To 50
If Cells(1, i).Value <> "あ" Or Cells(1, i).Value <> "う" Or Cells(1, i).Value <> "お" Then
Columns(i).Delete
End If
Next
End Sub 表示形式が混在したセルを見た目通りのまま表示形式が文字列の別のセルにコピーするいい方法ありませんか
例えばA1〜A3を、この見た目のまま表示形式が文字列のB1〜B3にコピーしたい場合
A
1 $1,000
2 2019/1/1
3 9:30
@
Dim buf() As Variant
buf = Range("A1:A3").Value
Range("B1:B3").Formula = buf '←そのまま入れてみる
B1〜B3は 3/6/2019、0.836111111、\10,000.00 になる
A
Dim buf() As Variant
Dim buf2(1 to 3, 1 to 1) As String
buf = Range("A1:A3").Value
For i = 1 to 3
buf2(i, 1) = buf(i, 1) '←文字列型にして入れてみる
Next
Range("B1:B3").Formula = buf2
B1〜B3は 2019/03/06、0.836111111111111、10000 になる
@Aどちらも書式が勝手に変わります
ちなみにセル範囲を配列に直接つっこまず、文字列型の配列に1セルずつ buf = Range(i, j).Text みたいな感じで入れてからセルに貼り付けると希望の結果になりますがめちゃくちゃ時間がかかります(大量データに使いたいので)
他にやり方があれば教えてください 例のA列は↓の間違いです、すいません
1 2019/3/6
2 20:04
3 \10,000 >>673
列インデックスで加算ループをしている途中で列削除をしてるから、削除した回数分だけ参照参照列の位置がおかしくなるのでは
例えば2列目を削除した後にループ処理の最初の処理に戻ると、次にi=3として.Cells(1,3)とセルアクセスしたときに見ることになるのは本来D1に位置していたセルになる
列削除した分インデックスがずれるので
こうやって減算ループにするのが正解の一つかと
Sub 不要列削除()
Dim i As Long
For i = 5 To 1 Step -1
If Cells(1, i).Value <> "あ" Or Cells(1, i).Value <> "う" Or Cells(1, i).Value <> "お" Then
Columns(i).Delete
End If
Next
End Sub
あるいは、列削除した場合にはEnd Ifの手前でiから1を引いてインデックス調整するようにしたりか >>673
改めて見たらIfの条件もおかしいね
And条件にしないと >>675
textプロパティ
Sub foo()
Range("c1").Value = Range("a1").Text
End Sub
範囲で代入は出来なかったので、適当にforeachで回してくれ
Range("c1:d2").Value = Range("a1:b2").Text >>677
止めた状態で遅いです
>>681
セルに直接入力していくと更に遅くなると思います >>682
あぁtext使ったって書いてたね、ゴメン
配列でも無理なら高速化はどうだろうか
https://15g.jp/post-314/
高速化でも配列でも重いなら、
もうアクセス辺りに移行した方がいいかも >>683
csvは勝手に変換されるのが鬼門すぎる やっぱりTextプロパティ使う以外無理そうですかね… 後は>>683かな
住所の"1-1-1"みたいなものがなければ行けると思う。
後はダメ元でgoogleスプレッドシートに移植してマクロ組んで見るとか >>686
textの取得だけループでまわして、
二次元配列に直して代入するとかは? >>688
遅いって書いてあるだろ。もっと上をお望みなんだよ >>689
直接入力が遅いって言ってるから、入力だけ一括でやれば?と思ったんだが >>687
他のファイルは使えない状況なんです…
>>688
その処理がすごく時間がかかるので他の手段を探していました
諦めます
今回の事でRangeのValueやFormulaみたいにTextも配列に入れられるようにしてくれと心から思いました
色々考えてくれたみなさんありがとうございました
もしいい方法思い付いたらいつでも待ってます 描写と計算止めてCopyメソッドで10万行×30列を列ごとにコピペしたら一瞬で終わったが・・・
っていうかこれ以上増やそうとするとリソース不足でエクセルが悲鳴を上げるし、どういうデータをコピーしたいんだろ >>691
>>684 の Application.ScreenUpdating = False
は効かないのか。 画面描画が止められるよ。やってないから適当なこと言ってるかもしらんが
画面描画以外で時間がかかるってどんなだよ。 ちょっと想像できんがなあ
なんでだろう >>691
valueで配列コピペした後に、セルに対してそれぞれ書式設定を手動もしくはマクロですれば?
書式は列ごとくらいは揃ってると思うし。
それもバラバラってことだと、そもそも集計の仕方が悪過ぎる。 >>674 >>678
ありがとうございます!
意図するようになりました。
-1で減らしていく発想は本当になかったのでいい勉強になりました。
このたびは本当にありかございました。 >>696
684じゃないけど、複雑に関数組んだりとか遅い関数が大量に入っててかつデータ数がエクセル上限近くで再計算に時間がかかるとか、あとセル上で反復計算やソルバー使ってたりするとある。
ただ684は書式がバラバラなセルを扱ってる時点で、複雑な計算をしてるとは思えないけど。 >>699
>>675をもう一度見て来いよ。 これだぞ。そんなややこしいことしている話ではないと思うが
>表示形式が混在したセルを見た目通りのまま表示形式が文字列の別のセルにコピーするいい方法ありませんか 再描画等定番の部分は止めています
セル数は100万ぐらい、列数、行数分回してTextプロパティを1セルずつ配列に入れる処理だけです
シートへの貼り付け処理ではなくこの取得部分に時間がかかります
同じ回数回すAや、Format関数、worksheetfunction.textを使った場合その半分以下の時間ですが望みの結果を得る方法はわかりませんでした… コピーした後NumberFormatで整えればええんちゃうん?
Dim buf() As Variant
buf = Range("A1:A3").Value
Range("B1:B3").Formula = buf
Range("b1").NumberFormat = "yyyy/m/d"
Range("b2").NumberFormat = "h:mm"
Range("b3").NumberFormat = "[$\-ja-JP]#,##0;-[$\-ja-JP]#,##0"
データが多すぎて無理? アー、見た目が同じまま、「文字列」なのか・・・
すんません無視してください >>675
A1:A3をコピーしてメモ帳とかに貼り付け
全選択してコピーしてB1:B3に貼り付けでできた
VBAだけで完結させる方法は知らん 勘違いしてる奴が多いが、自動計算を止めたり描画を止めるのは初心者が速度アップのためにやる方法で、>>675のように速度アップの為に考えて組まれている場合には効果が無い。
上級者はこういう場合に描画止めたりしないよ。
考えずに組んで面倒くさい場合にやる奴はいるかもしれんけど。 >>702
あとからNumberformatを適用させるんでなく配列に入れる時点で適用させる手を考えたんですが、
適用させるのにworksheetfunction.textを使うと書式に「マイナス値は[赤]」みたいな色設定があるとなぜか1004エラーが出るし、Format関数使うと表示形式が標準の時なぜか値が「標準」という文字列になってしまいます
速度的にはtextプロパティ使うよりずっと速いんですが…もう訳がわからない >>675
他に方法があるか探る時間が無いので何とも言えんが、DB処理にするか、マルチプロセスで上手いことすれば早くなると思う。 よく考えたらDB処理は駄目な気がする。
表示部分を扱え無さそうだ。 メモ帳にコピペすると書式が全部消えて見た目通りの文字列になる
メモ帳アプリの実体はエディットコントロールそのものだから、ユーザーフォームにエディットコントロールを貼っただけの作業場所を作って、そこ経由でコピペしてみたら? UserForm1にTextBox1とCommandButton1、TextBox2とCommandButton2の計4つが配置され
UserForm2には入力フォームが配置されています。
CommandButton1からUserForm2を呼び出した時は、TextBox1に記入
CommandButton2からUserForm2を呼び出した時は、TextBox2に記入
させるには、どうすれば良いですか? >>709
これ、本当?
だったらクリップボード弄って高速化できるかもしれない。 複雑な処理でデータ量が多いなら遅くても仕方ないんじゃね?
どうせエクセルだし、専門職じゃないし、大した会社じゃないし、給料安いし >>710
やり方はいくつもある
一番簡単な方法を書くと、
Userform1側の各ボタンのクリックイベント内に、任意のセルや標準モジュール上のPublic変数等にコマンドボタンのオブジェクト名をコピーする処理を書く(Me.ActiveControl.Nameでフォーム上でフォーカスされているコントロールオブジェクトの名前を取れるのでこれを使う)
Userform2側のイベントコードではそのコピーされたボタン名を読み取って書き込み先のテキストボックスを判定するようにする >>710
コマンドボタンのクリックイベントプロシージャで、グローバル変数に呼び出したボタン番号を格納→ユーザーフォーム2のコンストラクタでグローバル変数で分岐させる方法
もしくはコマンドボタンのクリックイベントプロシージャでユーザーフォーム2のマルチページコントロールのプロパティを変更する(value=1,2)方法もある セル範囲をコピーしてクリップボードから直接二次元配列に入れるようにしたら何十秒もかかってたのが0.5秒になりました
ただ、クリップボードから切り出す時にうっかりセルの値に手を加えてしまわないかが心配です
単純にVbCrLfで行を区切って、VbTabで列を区切ってるんですがそれで問題ないんでしょうか? >>715
セル内改行を使ってなければそれで大丈夫 >>716
セル内改行入れてみたら…またこんな落とし穴が… >>713
>>714
プロジェクトが大きくなるにつれグローバル変数は神経を使うので
極力さけたかったのですが
Form1.ActiveControl.Name、でいけそうですね システムの大規模化が想定されるならユーザーフォームでユーザーフォームを呼び出すのは危険w
ユーザーフォーム間の依存性を高めてしまうw
ここはユーザーフォームを呼び出すクラスを作った方がいいw
クラスを介して情報を渡せば安全だし再利用性も高まるw やっぱりuserformからuserform呼ぶのってよくないのか
こういうのってクラスモジュール使えるんだろうなって思ってたんだけど
余り使ったことなかたんで、ちゃんと勉強してみよう
参考書ぽちってきたわ
JavaとかC#を多少触ってきたからオブジェクト指向の概念は分かってるんだけど
VBAでの効果的な使い方をマスターしたいわ 引数付きコンストラクタすら簡単に実装できない言語で呼び出し用クラス作る方がきついと感じてしまうね、個人的には 普通のコンストラクタには引数渡せないんだ
まぁその辺の限界も含めて一度勉強しておいたほうがいいとは思ってる
できることと出来ないことを知った上で、クラスを使う選択肢を持つことができればいいかなって VBAでクラスとか言ってるのはたいてい知ったかだからスルーしていい
VB.NETとかC#知ってたらストレスしかたまらん そもそもVBAにクラスが欲しくなるような規模の要件を押し付けている時点で業務設計が破綻してる こういう場合にクラス使うの?
何か違うと思うんだが。
VBAでも見た瞬間にクラス使おうと思う場合もあるんだが、そういうことは少ないな。>>323のような話なら見た瞬間にクラスだなと思うんだけどね。 >>725
ワークシート上でデータが常に単なる二次元の表として見えているために、
その行をエンティティとして見るような発想になりにくいんだろうね
別にそれが悪いとは思わないが 逆にいうと、ワークシート上で人間が無理なく扱えるようなデータ構造にならざるを得ないから、
生え抜きのVBerが作りがちな酷いDB設計になりにくい
そういう良い意味でデータ構造に無理が利かないので、クラスでデータ構造を抽象化したくなるケースが少ないのだと思われる DBとして扱うならクラス使うことも考えるよ。
でも、DBとして扱うことも多くない。
DBならAccessにしちまうんで。 いまAccessを使う理由って何?
無料版のSQL Server のスペックの方が上だろう。
移行が大変だから? フォーム中心のまともなデータベースアプリが比較的簡単に作れるという点では意味がある
まあ今ならPowerApps使えばいいと思うけど PowerApps使うならPowerShellかJScript使わないとな
まぁVBAは要らんわ ???
会社のPCに既にAccessがインストールされているのにもかかわらず、
Excelで扱うような程度のものをDBとして扱いたい時に、SQL Serverインストールはじめちゃう人?
全てにおいてセンスねーわ。 >>733
正直君の意見はよくわからん
Management Studioすごく便利だよ
それにExcel からADOやODBCでつつく際のIFは大して変わらないんだからSQL Serverの方がパフォーマンスいいじゃん うちの会社そういうの入れる時はそれを使う理由説明して了解得るのに手間がかかる まあ普通はセキュリティ部門にリクエストして審査通らんと入れるのは無理だわな
VBAも原則禁止だから毎回例外申請してるわ 環境申請が必要な業務を未経験者にさせるほどうちの会社はブラックじゃない 会社がoffice365に切り替わってAccess使えるようになった俺歓喜 accessって開発続いてるの?
Excelを強化してAccessを見放すように思えてしょうがない Acccessとか。 いつの時代の遺品だよって感じだな
使いにくかったしなあ >>744
>>731も書いてるけどExcelとAccessって用途が違うから当面なくならないと思うよ SQLとOracleとAccess使うと書き方混乱する シート上に複数のテキストボックスを配置して、
KeyDownイベント + vbKeyRightとかvbKeyTabで、
テキストボックス間を移動出来るようにすると、
カーソルがたまに見えなくなるんだけど、回避策ない?
見えないだけで、存在はしているので、
文字は打てるんだけど、文字まで透明になっちゃう。
テキストボックスを何回か適当にクリックすると、
突然見えるようになる。 ↑あ、別のPCで開いたら再現しなくなった。
もしかして、グラフィックボードの問題? >>751
ボードと言ってるのはたぶんドライバのことだと思うけど、その可能性はあるよね。
いくつかバージョン違いを落としてきて試してみればいい。
とりあえずは、各メジャーバージョンが上がったばかりのは除いて、それぞれ最終リビジョンのを集めてきてかな excel vbaとaccess vba
どちらの方が実用的ですか? >>753
目糞鼻糞
今時ローカルで完結する業務要件なんかほとんどない 触り始めればすぐ覚えるよ
触る機会がexcelのほうが多いってだけ >>755
Excelだけでいいよ
今時AccessやるくらいならSalesforceでも覚えなさい >>755
超小規模ならExcel
テーブルの規模が大きくなってくるとAccess
Accessの何がいいかって言うとオレはレポートだと思ってる。あれを使いたいがために、オレはdbアプリ(フロントエンド)はAccess一択。
テーブルの規模がさらに大きくなってきたら、テーブルだけをoracle、SQLServerなりに移行。
そもそもAccessは大規模用ではないが、わかって開発すれば大規模用に寄せていくことはできる。 >>759
Access一択は語弊があるけど、Accessだけで完結できるならAccess押し。
あとは顧客要望で、webなりc#なり様々 >>760
需要の無いものをMSがわざわざ開発して売ってるのかw
無職の妄想乙 >>762
実際ほとんど放置されてるでしょ
そもそもAccessってノンプログラミングで専用アプリ風のDBアプリが作れるのがメリットなのであって、そこは全く否定するつもりはないけど
プログラミングするんなら他にもっと優れた選択肢はいくらでもあるよ 中小企業は普通にエクセル・アクセス
使える人間が多いのが最大のメリット。事務員だけでも割とどうにかなる
エクセルvbaは死ぬほど使う
アクセスはvbaじゃなくSQLを覚えたほうが良い
でもSQL覚えるのって結構たいへんなんだよよねぇ とりあえずVBAはどっちでも同じだから、あとはどういう環境を用意されることが多いかと考えると圧倒的にExcelに縛られることが多いので実用で考えるとExcelだろうか
Accessでやる方が楽な時でもExcelでやらされることが多いし Accessは大抵前任者なりシステムなりが作っている場合が多いから、ほとんど触る事が無い
エクセルは事ある毎に0から作ったり改修する事多いからvbaはめっちゃ役に経つ >>765
複雑になってくるとSQL知識は必要になるけど、クエリーデザイナ(QBEグリッド?)でほとんどできてしまう。
昔oracleでSQLゴリゴリ書いてたあとAccessのクエリーデザイナ見て「これ考えたやつ天才やな」とマジで思った。
選択も更新も削除も書けて、テーブル連結も表現できて、革命やなと。 accessで帳票画面作りが便利過ぎて
Excelにもレポートつけて欲しい
方眼紙神Excel化しまくり >>771
そもそも今時ローカル限定のDBなんてほとんど役に立たなくね?
ちなみに、https://support.office.com/ja-jp/article/ビデオ-access-web-アプリを作成する-10855ec0-3a12-4e6c-a67c-c88267f00a3c
> 重要 Microsoft では、SharePoint で Access Web App を作成および使用することはお勧めしなくなりました。 代わりに、Microsoft PowerApps を使用して、Web およびモバイル デバイス用にコードなしのビジネス ソリューションを作成することを検討してください。
だそうだよ Salesforceて。
クエリの自由度がAccess以下じゃん。 >>773
仮にそうだとしてもAccessより圧倒的にスキルの需要が高いのは事実だよね
それは何故だと考える? >>772
まじでAccessに親でも殺されたのかよw
必死にググって探してきたんだろうけど見てて恥ずかしいぞ >>772
ローカル?
Accesswebアプリ?
だから、知らないやつは黙っとけと。
自分の周りで需要がないから、どこもそうだとは限らないって考えられないのか?
MSが推奨してても、そうならなかったこともあるだろうに(いちいち書かない)。 >>774
sfは使ってる側だが、Accessと比べてる意味がわからん。
それぞれメリットデメリットがあって、顧客の要望にどちらがよりふさわしいかだぞ。
Accessのときもあるし、そうでないときもある
office365が広がって、Accessで作るメリットは開発側も、アプリ導入側も確実に増えてきた。
例えば、visualstudioで作るなら開発側は買わないといけない(小規模会社以外は)
これだけ書いてわからないとしても、スレ違いもあるからこれ以上議論しない。Accessスレでも、くだらないから議論しない ここは顧客のためにアプリ開発してるような人が来るスレじゃない、というのが前提にあるんじゃないの?
だから話がずれてしまう 個人商店で売上管理する程度か、ソフト会社でシステム管理任されてるかでは違いすぎるわな 顧客の要望笑さんのように目の前の要件だけ片付けてトンズラできる立場なのか、
将来も含めて面倒見ないと行けない立場なのかでも全然違うわな
後者ならさすがにAccessは正当化できないわ スキルレベルの話というより、制約条件が自分要因なのか顧客要因なのかが大きい。
こんな場所で顧客要因の話なんか相応しくないだろ、ってことだ。 winformやwpfがaccessより優れていればよかったんだがな >>783
分かる。なんか色々解決した気がする
Silverlightも死産だった >>774
そりゃググればいくらでも情報出てくるAccessとは比較にならんからな。 えっと、、、ここExcel VBAのスレですよね? 馬鹿はAccessのエンジン部分だけしか見ていない Access VBAは提供機能の環境結合度がExcel VBA以上に強いイメージを持ってるんだけど、Office365になってもバージョンアップによる互換性の問題は変わらない感じ? GUIをExcel、データストアをAccessとするアプリをVBAで作るのが最強ってことですね >>789
提供機能の環境結合度が何を言ってるかわからないが、昔作ったやつの改造質問が時々来て、軽く動かす範囲において互換性に問題があったことはない。
互換性問題でお客様から問い合わせ来たこともない。mdbの話し。
>>790
違います(indeed風w)
それぞれで無理なく完結できるならわざわざ分けない。そもそも「GUIをExcel」とするほどの優位はない。
データストア(テーブル)をシートでゴニョゴニョできる範囲ならExcelでやってもいい。デカくなるとAccess。
最近経験したのは、Accessのグラフが昔のママだったので、新しいグラフを使うためにExcelに結果出力することにした
(ながっ。Accessスレ過疎ってるけど、そっちで書いたとここに書けば何人か見に行ってくれると思う) Excelでも
VBAでも
質問スレでもない
でもどうせ平日は質問もないし、土日はこういう流れokみたいにしてもいいんじゃないかな どうでも良いけどセンスね―奴が多いな。
Salesforceってw
まず、会社で自分が使う環境になってからの話だろうに。
AccessやExcelと同列で語るとは笑わせる。
SQLサーバーも一緒。
Accessは単体で完結する使われ方も有るけどフロントエンドで使われる場合もある。
で、どちらの場合もSQLサーバーとは比較の対象にはならない。
俺はトヨタとかホンダとかと同じ知名度の会社で働いてるが普通にAccess使ってる。
というか、大きな所は結局いろんなツール使ってる。 知名度で比較してもその中には昭和みたいなやり方の企業は山程あるんだが >>796
と、その昭和な会社も思ってるからな
レスだけだと実際どうかは判別つかない 馬鹿でかいDBサーバーが何個もあって、ちゃんとしたシステムもある。
けど、いろんな部所が独自にツール作ってるし、その馬鹿でかいDBに参照だけさせて貰って、Accessをフロントにしてるのもある。
Excelをフロントにしてるのもあるな。
もちろん、好き勝手が出来るわけじゃないが。 >>797
そもそも大きな会社のことが分かってない発想だな。
大きな会社は新しい考え方してる部署もあるし、古い考え方してる部署もある。
普通に色んな部署があるからAccess使う所もたくさんある。 それにしてもAccessに批判的な意見に対して「センスが悪い」と言うのは変なバイアスを感じるよな >>799
全社システムを入れてデジタル化を推進しようとしてるかと思えば、部署や事業分野毎に統制レベルがまちまちだったりして結局色んなシステムやアプリを使ってたりするのがいわゆる大企業だよな
もちろん電話FAX紙資料頼みの昭和的なやり方の部分が残ってることもある 大抵の部署は「エクセルワードパワポ使えりゃいい」ってことでHome&Business買って終わりだからな
そもそもAccessに触れる機会がない 3つのエクセルファイル開いて終わったら
3つともcloseしてquiteしてるんだけど
タスクマネージャみたら3つのエクセルがのこったまま
なんでー? >>804
プロセスが残ってるってことだよね?
3つのエクセルファイル開く前はプロセス0個だった?
closeしてquiteしてるオブジェクトはちゃんと合ってる? >>803
いわゆるそれなりの企業でOfficeを個々の部署で買ってるところってそんなにないだろ >>808
ウチの場合各部署の上長に選択肢与える方式だから
Publisher使う広報部以外Professional選ぶとこほとんどないよ >>802
論点の分かってないバカは何処にでもいるな。
つまり結論は、Access使ってるということだよ。
それにAccessと比較できるようなソフトが無い。
それが分からんからセンスがね―と言われる。
FileMaker挙げられたら分かってる奴だろうが。
>>803
そりゃ残念だったな。
Officeは部署で買うもんじゃ無いと思うぞ。
聞いたこと無いけど。
うちの会社は全員Access入ってると思うぞ。 >>801
センスが悪いのは対抗に成りようがないもんを挙げてるからだよ。 >>809
個々に発注してるの?
ボリュームライセンス使わないの? AccessやめてSQLServerにしろって言われて移行の手間以外の理由で嫌がる人間がいるだろうか?
いや、いない なんか他人を見下したいだけのタイプっぽくてウザいからNGしたわ
仮にこいつがAccess詳しくてもこいつから教わりたくないなって感じ VBAより細かいことができて簡単でメジャーでお勧めってJAVAでいいの?
用途は個人で簡単なアプリを作る程度です。 Access取り上げられてManagement Studio渡されたらうにょる >>813
SQLサーバーにするようなのは手間もそうだが、規模が違うだろ。
そんな話になるなら最初からExcelやAccessの話になんてなってない。
そんなこともわからね―のかよ。
自由にできる中小とは違うんだよ。 >>815
それは微妙だな。
細かいことは出来ない場合がかなりあるだろうな。
簡単かどうかも微妙。
難しさの方向性も違うし。 >>816
問題は何で組むかって話になるだろうね。
昔、MSDEで組んでた時に使ってたけど、Accessなんか競合するようなもんじゃない。
まあ、VBAでも組めるからExcelやAccessから繋いでも良いんだけど、それって本末転倒じゃね?
結局VisualStudioで組む話に成るんだろうな。 >>813
想定の範囲内でしたね
Access以上に帳票作成が楽なソリューション出してください
あなたならできるはずです
あっ、もちろんコストは想定の範囲内でお願いしますよ >>821
ExcelからSQLServerのデータをつつけばいいじゃん
このスレ的にも趣旨にあう 印刷に難のあるExcelで帳票作成?
わざわざ茨の道を進む提案は想定の範囲外でしたよ
次回からもう来なくていいですw >>823
帳票?印刷?
そんなもんPCでやるわけないでしょ
君こそふざけてるんじゃないの? >>825
帳票印刷なんて古い基幹システムでやるもんだし、レガシーでつまんない仕事だからPCでやりたくないでしょ >>826
お前さん、例えばスマホとか契約した時に契約内容を記載した紙貰ってないかい?
帳票ってそう言う奴のことな >>828
それをPCのアプリで出力しないでしょ?
現場のPCでやるのは出力された帳票イメージをプリンタに送ることさ まあホスト側でPDFを作っちゃって、あとは印刷するだけみたいなシステムも最近は増えてるけど、
送られて来るのは印刷したい数字だけで、クライアント側で印刷イメージを組み立てるシステムだって普通にあるぞ >>831
ここは大企業やサーバ管理者専用スレじゃないし
世の中にはパソコン1台だけで経理や発注をやってるような中小零細だってある
現実にExcelで作られた帳票は世界中を駆け巡ってる >>829
お前一度帳票ソリューションとかでググってみ
いろんな形態あるから1種類だけで語ると恥かくぞ >>823
印刷は確かに若干弱いがエクセル帳票は悪くないアイデアだと思う
プログラムで生成物からデータを取得できるから帳票作成のスモールテストを作りやすい
まあCIサーバーで動かないと意味がないのでVBAの出番はないけど >>833
世の中全体なんて言ったらきりないでしょ
>>828が言うDOCOMOショップとかの話に反論したのさ >>835
「例えば」っていう文言すら理解できないの?w
てか、話の流れでわかるだろ >>836
いやいやいやいや
「帳票なんて基幹システムで出すもんでPCじゃしないでしょ」という意見に対して>>828は携帯ショップの例を出してきたんだぞ 言わんとする事は分かるけど、
ID:tsrenNBW0 は色々と日本語おかしいぞ
入って半年の新人か、酔っぱらいが話ししているようだ >>834
Excelはページ内の列に縛られるから結構大変だよ
見積書とかでお客様名称の位置を変えたら一覧表に影響するとか
特に複数の表を位置ページに収めるとかが大変すぎる >>837
そこまで言うならすべての携帯ショップの帳票システムが1種類しかないことをソース付きで示してくれ >>837
帳票は基幹システムでも出すし、現場のAccessからも出します。
携帯ショップのはあくまで例えだが、アプリで出してても何らおかしくない。webからサーバで作成した帳票出してたとしても世の中全てがそうじゃない
バカはすっこんでろ >>843
ああ、じゃ携帯ショップの話は例が悪かったってことで引っ張るのはやめにするよ もともとAccessなんかよりSQLServer使えばいいのに、という意見に対して「センスが悪い」と評したやつがムカつくんだよね
それってただの自己擁護じゃねえの? >>845
ExcelVBAスレで何言ってんだって話だよな まーまー、みんなケンカするなよ。ケンカしたくてここに来てるやつはどっか行ってくれ。楽しく、とまではいかないにしても、他人の意見を尊重して、まったりと行こうぜ 他人からファイルが返ってきたときに印刷プレビューになってるとイラっとする >>849
自分はそれじゃなくてアレがイラッとする
だからよく ActiveSheet.DisplayPageBreaks = False
をやる >>845
最初に「今Accessを使う意味」とか、言い出した奴が都合が悪くなると人のことを上から目線だとか言い出すからなあ。
そもそもの話はAccessにしちまうからExcelでDB処理することは多く無いって話から始まっている。
(実際は結構あるけどAccessと食い合うって話)
最初から、バックエンドSQLサーバーでフロントがExcelって話なら、SQLサーバーじゃなくて正にExcelでDB処理の話になって、俺の主張に一致するから反論にならん。それとも絶対にExcelフロントでAccessフロントはあり得ないって話ならもう一度センスね―と言ってやる。
Excelフロントはあり得るけどAccessフロントの方がよりあり得るわ。
いやいやそういう構成ではExcelでDB処理には該当しないというなら、ExcelでDB処理とはExcel単体でのDB処理ということになるから、それに対しての比較対象にSQLサーバー持って来たの?という話になる。
この場合もやっぱりセンスね―と言ってやる。
だからそもそもの話に反論としてSQLサーバーを挙げるってことはExcelフロントではないということを意味するんだろう。
つまりOffice系では無く、開発系で組むという話だろう。
Accessで済むようもん、場合によってはExcelで済むようもんをC#とかを使って組むの?
部署内での打ち合わせ資料をWordで作ると言ったらPagemakerの方が良いと言われた気分だわ。 accessが好きとか嫌いとか最初に言い出したのは誰なのかしら >>852
3回読んだが意味がよく分からん
俺の最初の主張は>>729から始まってるんだが、「データはExcelじゃなくてAccessに置け」という他の意見に対して
「いや今時AccessなんかじゃなくてSQLServerでしょ」というのが意図だ。
そっからなんかこじれてるんだが、ここでの俺の前提はフロントUIはエクセルというものなんだよね。
ExcelからのSQL発行という点でUI表面上の差が大してないと考えて比較している。 >>854
フロントがExcel程度でなんとかなるデータならAccessで十分だろ
すでに大量のデータがSQLServerに溜まっているならそっち使えばいいけど
Excelでデータ入力とか考えただけでも吐きそう >>856
フロントでやるのはデータ分析だろう。
データ入力は現場の仕事。
フロントと現場を混同してるだろ? 二人以上でAccess使うなんて想像してなかったわ。すまん >>858
データ入力画面もフロントだよ。
現場でどうデータ入力させようとしてるのか書いてみろよ。 端から見てると何でこの人たちがVBAやらされる羽目になってるのか分かるよね むしろこんな奴等に何かやらせる羽目になってる上司に同情するわ うちなんかSQLServer導入して部署内誰でも使えるようにセッティングしてるのにずっとAccess使い続けてる。
Excel VBAからADOで繋げてるパターンなんで移行は手間じゃないと思うんだけど2〜3人が試しに使い始めただけ。
思い通りになんていかないよ。
社内稟議通した人がお気の毒w >>854
八ァ?
>>729から始まってるんだよな。
その前に「デ―タはExcelじゃなくてAccessに置け」なんて意見が何処にある?
>>729の前にAccessのことを言ってるのは>>728しか見当たらないんだが。
で、俺が言った>>728は別に「デ−タはExcelじゃ無くてAccessに置け」なんて言って無いんだが。
誰かにこうしろ等と言って無いし、データをAccessに置く等と限定してないぞ。
その上、「今時Access」?
お前は一体何様だよ。
どっちが上から目線だ?
上から目線でも回答が頓珍漢じゃなければセンスね―なんて書かね−よw >>867
それはちょっと悲しいね。
まあ、ファイル単位で移動出来るメリットもあるからDBサーバーあってもAccess単体ってのもあり得るけどな。 >>867
それはね、ローカルに置いてる(としとこう)Accessの中に人に見せられないデータがあるからだよw >>867
そもそもそれエンジンの話なのか帳票とかのデザインの話なのかはっきりしてくれ
あと人は今困ってないなら移行なんてしないよ、トラブル招くかもしれないしな
移行させたいならAccess使用禁止ぐらいしないとダメ
どうせ導入した奴もそこまで腹くくってないだろ >>867
SQLサバだとテーブル設計とか後からいじりにくいんだよな
連結フォームに全データ表示!とかも気楽に出来なくなるし >>867
もしかしてクライアントサイドの管理ツールとか知らないのでは? >>871
テーブルを移行して欲しいんだけどやってくれないって状況
導入した人は権力があるのでそのうち強制するかも >>875
移行するメリットがないとねぇ
レコード数が少ないと速度なんてほとんど変わらないし…
100万レコードでも、きちんと作られてればAccessでも十分実用になるし…
まずは、めちゃ処理時間がかかるやつ一つを移行。ストアド作り込んで速くなるのを見せるとか。
せっかくSQLServer使うなら、ストアド使わないと勿体ない。ただレコード持ってるだけの箱になってしまう。
ストアドはとっつきにくいと思うが、レコードをこねくり回すような時間かかる処理には効果絶大。
逆に言うと、軽いデータや処理のmdbは移行後回し。(というより、そんなの移行しなくてよろしい。労力に見合わない) >>876
いきなりストアドで大規模ロジックを書こうとしても、どう書くべきか(どう書くのがふさわしいか)わからないと思う。
小ロジック大量レコード処理辺りから書いていきましょう >>876
自分含め誰もspとか知らない
一般的なプログラミングは割とできて、みんなVB/VBA、C#、C++、rubyとかでなんとかしようとしてる
まさにDBを箱としか見てない ストアドはRDBの設計思想に反する邪悪な存在なので可能な限り避けるべきです
最適化をかけにくいのでインデックスの効いたクエリに比べて速度も遅くなります Webシステムで全て開発側の手元にあるんならストアドなんか害悪しかないけど、
VBAだったらストアドやビューを最大限に活用して可能な限りDBMS側に寄せるべき
神VBAは作りっぱなしで逃げられるならいいけど、後々Excel側の変更やDB側のスキーマ変更で地獄を見ることになる ExcelからAccessのデータを取得するきはこういうコードをクラス化してAccess立ち上げる必要ないようにした。
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_030.html
他言語使ってる人の事情は知らんけど似たような感じだと思う。
SQLサーバ向けのもADOだからインターフェース変えずにできた。
せっかくツールったんだから移行しろよ!
と思ってたけどもう何がいいのかわからんくなった。 >>875
それエンジンだけをすげ替えろって言ってるってことだよね?
そりゃわざわざ移行しないよ
メリットないから強権発動しかないと思うよ >>880
>>879はなんか勘違いしてるだけ
ストアドは簡単に言うとサーバー側でロジックが動くだけの話だからインデックスが効くかどうかはストアドが発行するSQLに依存する >>884
879が批判してるのは、ストアドの中でループしたり一時テーブルを安易に多用したりするような使い方じゃないのかな >>882
そのめんどくさいselect文を作るのがaccessやssmsじゃね? >>884
インデックスが効かないとは言ってませんが?
SQLなら期待される結果を返す範囲で最適化して高速化する余地があります
これはSQLが宣言的な言語だからできることです
最終的な答えが同じなら途中の結合や絞り込みを入れ替えたり省略することが可能です
逆にストアドは手続き型なので基本的に定義した順に処理が逐次実行されます
全く最適化できないわけではありませんが宣言的な言語と比べるとこの順序があるという性質のせいで制約が強く最適化のかかりが弱くなります >>887
理念には同意するけど、VBAスレでそれ言う?
Excel VBAこそ、本来は宣言型であるものを手続き型に落としてしまいパフォーマンスを低下させている例の最たるものだよ >>885
変な使い方を前提にストアドが遅いとか言われても困る >>889
実際、ぐるぐるSQLを書いちゃうような人はDBに寄せた設計になるとストアド使いたがるからね >>887
だからその逐次実行を行うのがクライアントなのかサーバーなのかが違うだけでしょ
そりゃストアドと単一のSQL比べたらストアドの方が遅いだろうけどクライアントが同様の処理すること思えば全体としては(ちゃんと設計されてりゃ)速くなるでしょ >>891
SQLをコンパイルする必要がないからストアードの方が速くね? >>892
理論的にはそうだけど、現実にはそこは全く関係ない
SQLのコンパイル時間はサーバーとの通信のコストと比較すれば無視してよい そもそもSQLの発行がパフォーマンスに響くような状況はSQLの粒度が小さすぎる
大抵そういう時はうまく纏めれば一桁速くなる >>891
アプリケーションとストアドの比較をしているのではなく同じ結果をもたらすSQLとストアドの比較をして言った
そもそもアプリケーションに書かれたビジネスロジックをそのままストアドに移植する時点で論外なので比較する発想がなかった >>895
> 同じ結果をもたらすSQLとストアドの比較をして言った
そりゃSQL単体で書けるならその方が速いわなw
SQL単体で書けるのにストアド使うとか普通あり得ないでしょ? >>896
残念ながらありえます
しかも少なくありません
単にSQLが苦手な人
ストアドの方が速いと思ってる人
深く考えずアプリケーションコードストアドに移植してしまう人
SQLでいいのにストアドを書いてしまう人というのは何処にでも居ます >>897
>>889
お前の周りのことなんか知らんよw 一体いつまで同じ話をぐだぐだ続けるつもり?
プログラマ板のどっか雑談スレでやれよ低能プログラマどもは セルA1に =aaa と書き込んで数式エラーを作っておきます
その上で
Dim ary() As Variant
ary = Activesheet.Range("A1:A10")
MsgBox ary(1, 1)
結果:
型が一致しません
ary(1, 1)をVariant型の変数に代入する場合は何も起きないので
MsgBoxに表示するときに内部的にString型に変換するため
エラーがおきるのだろうと思っています
それはともかく、ary(1, 1) からエラー値を削除したいのですが
ary(1, 1) = ""
MsgBox ary(1, 1)
とやってもダメでエラーが出ます
ary(1, 1) を何もない状態にするにはどうしたらいいですか?
ary(1, 1)はこの先いろいろな操作をすることになるため、そのたびに
どこに隠れているか分からない数式エラーをチェックするのは大変なのです ごめんなさい
>>904は取り消します
何か他の要因がからんでエラーが起きていたようです
上の例だとエラーはおきませんでした
ごめんなさい とりあえず
Dim ary() As Variant
はエラーが出るので
Dim ary As Variant
に変更している あー、荒れてるところ申し訳ないのですが、
ちょっと、質問…いいですかね…
初心者なんでさっぱり文が思いつかないから
例文みたいなのを作ってほしいんですけど…
B3:F○○の表があります。
・B3:F10にそれぞれセルに名前を付けていきたい。
・B3を「_0」としてC3「_2」というように、+2ずつ、
F3「_8」までいったらB4「_10」と同じように+2して、
最後のF10までやりたい。
こんな感じのってできますか??
他のシートでも同様の作業を行ないたくて、
B3から、F列の表で、数字が入力されている部分だけ名前をつけたいから、
if文とかで、数字が入力されていなかったら名前をつけるのを終わるみたいなできたら嬉しいです。 >>907
先に範囲選択してからマクロ実行
セルに何も入ってない場合に終了(数字かどうかは判定していない)
Sub Macro1()
番号 = 0
For Each セル In Selection
If セル.Value = "" Then
Exit Sub
Else
ActiveWorkbook.Names.Add Name:="_" & 番号, RefersTo:="=" & セル.Address
番号 = 番号 + 2
End If
Next
End Sub 以前、ifの条件に合わない時に実行したい時はthenに続けてelseと書いて実行したい内容を書くよりも、条件をnotで括った方が処理が速いと言われました
実際に計測したら確かに僅かな差が有ったのですが何故なのでしょうか >>909
ありがとうございます!
やってみます! >>910
Ifブロックは先頭の条件から逐次Boolean評価していって、一度Trueと判定されるとそこで条件を満たす場合の処理を実行し、残りの条件は評価しない仕組み
Elseのケースでの処理を実行するとなると、If条件とそれ以降のElseIf条件全てにおいてTrueが成立しないという条件が必要になる
なので、同じ条件数のIfブロックで比較すると、Elseより前に置かれた条件で処理を行わせる方がElse以降で処理させる場合よりも条件評価を行う回数が少なくなる >>912
if not true then temp = 0
if true then else temp = 0
の二つのif文があった時、後者はtrueの評価の後にelseという評価をしてるという事でしょうか >>912
VBAはショートサーキットしないけどな >>912
何か微妙に勘違いしてる?
Elseifは関係ないぞ >>913
elseという評価はしていない
評価というのは、判定してると言っていると思うが、判定はifのとこで終わってる はっきりさせておきたい
VBAのとき、
if A and B and C then
ってなってるとき、A、B、C全部必ずチェックするのか、AがFALSEだったら、もうB、Cは無視するのか
どっち?
C言語みたいに、& と && みたいなandに2種類ないよね ショートサーキットないおかげでどんどんネストしてゆく… >>917
そういう場合は
Select Case False
Case A, B, C
' !( A && B && C)の場合の処理
Case Else
' A && B && C の場合の処理
End Select
と書けばショートサーキットになるよ。
直感的じゃないけどね。 不慣れな初心者ですみません
リストシートのボタンを押すと
リストに入力していたデータ行数分書類型シートが作られるのですが
その作られた書類型シートにもそれぞれボタンがあり
各ボタンを押すとデータ送信用シートが作られる二段構造?になっています
書類シートからデータ送信用シートを作るには
いちいち各シートのボタンを1つずつ押さねばならず大変です
選択したシートのボタンを一括で押すことのできるマクロはありませんでしょうか…?
本当はリストからボタン1つで書類シートとデータ送信用シートができれば最高なのですが
そこまでの改変は難しそうで… >>922
それぞれのボタンに組まれたマクロを一つのボタンにまとめる ごめん>>923は内容勘違いなので忘れて
一括で送信シート作るボタンを一つ作ってその中に、
forで選択した書類シート分回す
その書類シート内の送信シートを作るボタンClickを呼ぶ
Next
ってのはどうですか >>922
見られちゃマズイデータ消してアップロードすれば誰かが作ってくれると思う Clickを呼んでも、クリックするわけじゃないが、
クリックされちゃいそうで怖い。 ピボットテーブルの集計結果使いたい時って今まで計算用シートで作成→せる決め打ちで取得 てやってたんだけど稀にカラムずれる
こういうのvbaだけで計算する関数とかないよね? ピボットテーブルはアドホックな集計や分析に使うもんだろ
やることが決まってるんなら要らん >>922
現物見てないからよくわからないんだけど、
リストシートや書類シートにボタンがついてるってのは
マクロ有効ブックの中にそれらのシートがあるってこと?
出来ればデータとマクロは別のブックに分離しといたほうが良いんじゃないかな。
そういう作りにしてれば改修も簡単になりそう。 >>927
普通に
If A Then
If B Tnen
If C Then
A And B And Cの時の処理
EndIf
EndIf
EndIf
とするかな。
でも、これでの速度アップより、他に速度ダウン要因を減らした方が良さそう。
自分はIf A AndB And C Thenを気にせず使うな。 >>932
Aが成り立たないときBを評価するとエラーで止まってしまう場合とかが悩ましいんだ >>932
うん、他にやることありそうな気がするぞ
昔の俺みたいに実はコンパイルしてなかったとか笑 なんとなくだけど、VBAであまり離れ業を使わないほうが良いとは思う >>933
それは別の問題だよ。
そういう場合は最初からIf A And B And C Thenなんてやらない。
Bの評価でエラーが出ない時でも必ずBの評価をすることで速度ダウンするのを防ぐために
If A Then
If B Then
EndIf
EndIf
とするかと言えば、普段はやらないということ。
それで得られる速度アップより他の修正をした方がよっぽど効果有るだろ。 >>939
なるほど、ちゃんと明記されてるんだな、ありがとう 短絡評価の件で速度云々言ってるのはID:YBKQY7Hwdだけだし いやいや、役に立った(参考になった)ボタン押してますから ショートサーキットが活きてくるのは、Boolean型の関数を並べるときだな
If Func1() Or Func2() Then
みたいなケースだと実行時間がかなり違ってくることも起こりうる 標準関数の戻り値に文字列"false"が返ってくる言語があるらしい >>943
伝わって無いようだな。
まず、>>910の速度の話から始まっている。
で、>>932は「俺は」速度を気にしないから普段はやらないけど、とにかくネストすりゃ良いって話。
>>927に速度が念頭に無かったとしても>>932は成立するんだよ。 で、>>933は俺が普段やらないという所に反応したわけだ。
それに対して>>940はBのエラーが想定される時は普段もネストするって話。
こちらも成立してる。
あえて言えば>>933が少し外してる。 >>947-948
速度の話(>>910)と短絡評価の話(>>917)は別な
混同してるのはお前だけだぞw >>949
バーカw
短絡評価云々についてはネストすると言ってる。
でも普段は速度を気にしないからネストしないと言ってる。
ここでの速度の話はついでの話だ。
ついでの話で速度を蒸し返したのは俺が最初で、別に>>917が速度のことを考えていなくても何も問題ない。
ついでを書かないと、どんな時も俺がネストしてると思われるから書いてるんだ。
>>917が速度のことを気にしてると俺が思ったからでは無い。
このついでに反応した>>933は「俺が最初に蒸し返した」のでは無く、「俺が>>917を勘違いした」と思ったんだろう。 何だこいつ
お前が常にネストするとかどうでもいいよw のび太 ドラえもん、なんか道具出してよ
ドラえもん まーまー棒、 ――――◯ ID:YBKQY7Hwd
こいつが一番バカっぽい w マクロというものを知ったばかりです
■リストから単票を印刷する
http://www.aibsc.jp/nsj/03_07_it/090201_01/index.shtml
というマクロを使い注文書を作りたいと思っています
このマクロだとリストに同会社がある場合
同会社がある分だけ印刷されてしまいます
同会社の場合は注文をまとめたいのですが
どういうマクロを組めばいいのでしょうか?
お力を貸して頂きたいです
リスト
https://i.imgur.com/B7EAyhw.png
理想
印刷1枚目
https://i.imgur.com/s4Lbrxu.png
2枚目
https://i.imgur.com/zKOwgMq.png ここで「データをExcelに置くのはやめてSQLSeverとかに格納しよう」って答えたら荒れるのかな? いや、ここはAccessの出番でしょ
って更に混乱に陥れるとか? >>952
頭に血が上ってるようだな。
別に>>932はこうしろだなんて言ってないんだが。
それを言うなら反応した方がずれてるだろ。 >>955
何だそれwwwww
印刷画面にIndex関数を埋め込んでおけば、
5行くらいで書けるんじゃないのwwwww
で、まとめる方法だけど、やっぱAccessを勧めるな。
Excelでも出来るけど、餅は餅屋だとわかる方がいい。 勝手に人のことを推測して反応したら、推測の当てが外れて相手から否定的な意見をもらって怒り爆発って事態がこのところ続いているようだw >>955
accessって意見が多いけど、俺はvbaでやるかな
・まずまとめるシートを新しく作る。一社一行
・それを今まで通り印刷していく
が主な流れと思う
作業自体は難しくないが、仕様が複雑怪奇である
・納期はどこからどこまでか?最短?最長?平均?
・数量もどうまとめるのか?
・品番はどう表記するの?
など、山程考える事がある ていうか2009年って。
書いた本人も、内心消したいと思ってるんじゃないのそれ。
当時は良くても、10年後にActiveCell.Offset(1, 0).Selectとか見たら、
あちゃー(ノ∀`)だと思う。 ActiveCellのoffsetでSelectとかなかなかやね
マクロの記録でもないだろうから、一生懸命頑張ったんかなって >>955
ランサーズとかで依頼したら?
ゴミみたいな値段で誰か作ってくれるよ ん、ちょっと待った。
注文書を印刷?
今時そんなことやったら、受け取る方は嫌がると思う。
どうしても紙にするなら、
見た目の格好良さなんか度外視で、
QRコード・品名・数量・納期を、ただ羅列するだけの方がいいよ。
パソコンなんか使ってないような、クソ田舎の店に注文出すわけじゃないんでしょ? >>955
できるだけ単純な方法だと、
・リストにマクロ用の作業列を1列用意する
・マクロ開始時に作業列をクリア
・ループ内で印刷シートにデータを入れ込む前に、その行の作業列が空白かどうか見る
空白なら印刷シートに社名とデータ入れて、作業列に1とか適当に入れる
FindとFineNextで同じ社名全部検索して、1個目と同じように見つかった行の作業列に何か入れてデータを印刷シートに入れる
・印刷実行 >>962
そこでさらに
Driver = {Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)}
使えといって混乱させる 批判とかする気持ちは分かるけど、だったらダイマ批判の覚悟でそれ相応のサービスを紹介してあげてはどうかな
さすがにそろそろvbaで請求関係は終焉させてあげたい。よく20年も頑張ったよ まぁ俺はgoogleanalyticsのマイレポートをctrl+aでコピー*3、EXCELに貼り付け
多様な角度からレポート生成
なんてシステム作ったけどな
役に立ってるかは知らん >>955
Accessわかる人は、何も悩むところがない
わからなければ、Accessの勉強で苦労するか、ExcelVBAで苦労するか
好きな方選べばいい >>955
業務の内容から考えるとAccessのが良いっぽいんだけど、規模によるかな。
注文する会社はどれくらいあって、この注文書ってどれくらい印刷するのか。
そもそもDBにするような話なら既にそうなってる気もするんだよな。
だからExcelでDBにもしなくて良いような気がする。
>>963
全く同意だけど、記事の内容を見ると初めてVBAを触る人向け第2回って感じだから、マクロ記録をちょっとだけ改変って感じなんじゃない? >>970に書いたのは冗談じゃなくて、データは専用の別ブックに置くようにして、マクロ(と印刷用画面)と分けた方がいい。
データブックからの読み取りはSQLでやる。
こうすれば将来のDB化にも繋がるよ。 マクロというものを知ったばかりの人にSQLとか言い出すってどうなんだろう?
そういう所だよ。 >>977
じゃあ最初からDB使え
後で使うだろうと無駄な設計やコードを残していったアホの後任が不憫でならない >>977
データを分けたらAccessのリンクテーブルにもできるだろうから、徐々に移行ってこともできるよね データの保存はiniファイルと隠しシートどっち使うのがスタンダードなの? 普通に表示しているシート
後iniファイルって古い。今はxmlが主流だよ iniファイルってデータの保存用とかじゃなくプログラムの設定用だろ?
まぁどちらにしろ古いけどさ。 この前、セルに _(数字)の名前を付けたものです。
(数字)は変数として定義してあるのですが、
アンダーバーが使えないため、_(数字)を参照できません。
なんで新たに、Sujl、みたいな変数の箱を作って
Suji = "_" & (数字)
っていうのにしてみたんですけど
セルにSujiを入力するようにすると、_2のように表示されるのですが
Range(Suji).Select
だとエラーが出てしまいます。
どうやったらその名前を付けたセルを参照できますか?? _2 って名前を付けたセルを
どうやったら呼び出せるのかなって
2の部分は入力によって変えたいから
どうしたもんやらって
分かりづらくて、センスなくてごめんね。 Suji = “_2”
Range(“A1”)=Suji
はできたけど
Range(Suji).Select
はエラーになるのはなぜか >>991
意味が全く違うからとしか言いようがない
まずはどういう結果を期待してて何故それでうまくいくと思ったのかを晒せ >>986
その記述で参照できる
その呼び出したい名前の定義の「範囲」はブック? >>984
今のところ、次の主流はとくに決まってないよ
jsonもけっこう幅広く使われてるし、ほかにもいろいろなデータ記述法が登場してる MSに忠誠を誓うなら今はJSONだね
最近のMSはXMLをどんどん排除してJSONに置き換えてる >>983
データの量によるけど少量ならCustomDocumentPropertiesかな >>996
JSONいいんだけどコメントが書けないのがなぁ >>997
一項目あたり225文字が限界っぽいけどね。
ちょっとスマートな感じがするから一度使ってみようと思いつつまだ機会がない。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 34日 5時間 42分 33秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。