!extend:checked:vvvvv:1000:512
ExcelのVBAに関する質問スレです
コード書き込みや作成依頼もOK
※前スレ
Excel VBA 質問スレ Part62
https://mevius.5ch.net/test/read.cgi/tech/1561303297/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
Excel VBA 質問スレ Part63
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ d3d0-EPXH)
2019/09/16(月) 19:34:59.04ID:emfTAhXr0200デフォルトの名無しさん (アメ MM11-pTrw)
2019/10/08(火) 07:37:46.07ID:wEzHRAYiM 〉〉196です。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
201デフォルトの名無しさん (ワントンキン MM7a-arkt)
2019/10/08(火) 07:52:03.60ID:o1U1FjwuM 無理に英語やローマ字にするくらいなら日本語でいいと思うけど
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
202デフォルトの名無しさん (アークセー Sxbd-2RUv)
2019/10/08(火) 08:16:32.23ID:l+0JwRkcx >>199
ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する
どちらもコーディングや保守の工数は大して変わらない
ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
Publicにするのが嫌なら、呼び出したいPrivate Subが定義されたモジュールにコールバック用の引数付きでPublic Subを定義して、呼び出したい任意のPrivate Subを引数で指定して呼び出せるようにする
それも嫌ならクラスを作ってPrivate Subをメソッド化する
どちらもコーディングや保守の工数は大して変わらない
203デフォルトの名無しさん (ワッチョイ 3968-G1PU)
2019/10/08(火) 20:03:58.77ID:XnwML2Ug0 >>202
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました
他の方法も勉強になりました
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました
他の方法も勉強になりました
204デフォルトの名無しさん (ワッチョイ 397c-GY5J)
2019/10/08(火) 20:07:56.35ID:Uz+DmrF+0205デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
2019/10/08(火) 21:30:26.55ID:HDWpL7A50 >>200
ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
ありがとうございます。
コメントつけまくって分かるようにしてます。
まぁ詳しい人が見たらめっちゃくちゃで分かりにくいと思うのですが、
自分用で自分が分かればいいので動くようにして少しづつ改良していきます。
多分、めっちゃ不具合あります。
206デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
2019/10/08(火) 22:01:56.51ID:HDWpL7A50 データベースから原本のシートに転記する場合表内でのループは可能ですか?
但し、実際に転記する表の上下に題名や表題があります。
例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目
にするという事は可能でしょうか?
出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも
作成したいのでできるのであればご教授お願いします。
上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行
で行けると思うのですが表の最後の指定がわかりません。
forをネストすればできそうですが、それでも20番目でおわる形にする感じ?
21行目を2ページ目の1行目を指定するのは難しそう
但し、実際に転記する表の上下に題名や表題があります。
例えば1行から20行での表があり繰り返すデータが21行目なったら2ページめの1行目
にするという事は可能でしょうか?
出来なさそうなのでリストボックスで見やすく作ろうかと思ったのですが、印刷用でも
作成したいのでできるのであればご教授お願いします。
上だけなら、forの頭を指定して10番目ならfor i = 10TO 最終行
で行けると思うのですが表の最後の指定がわかりません。
forをネストすればできそうですが、それでも20番目でおわる形にする感じ?
21行目を2ページ目の1行目を指定するのは難しそう
207デフォルトの名無しさん (ワッチョイ c55f-Je0l)
2019/10/08(火) 22:10:00.62ID:QtXyLjSg0 伝え方って大事だよね
208デフォルトの名無しさん (ワッチョイ 397c-GY5J)
2019/10/08(火) 22:11:56.81ID:Uz+DmrF+0 >>206
21行目になったら次の改ページ位置を貼り付け先にする
21行目になったら次の改ページ位置を貼り付け先にする
209デフォルトの名無しさん (ワッチョイ 397c-GY5J)
2019/10/08(火) 22:13:49.93ID:Uz+DmrF+0 または上下の題名をヘッダフッタに指定して改ページを気にせず貼り付ける
210デフォルトの名無しさん (ワッチョイ b501-UYl5)
2019/10/08(火) 22:46:38.31ID:IntPDsvb0 >>194
出来ました。大変ありがとう😊
出来ました。大変ありがとう😊
211デフォルトの名無しさん (ワッチョイ 9fa2-8cCB)
2019/10/10(木) 21:20:24.18ID:gS7zDweR0 たまにpowershellの話題出るから聞きたいんだけどpowershellってUWSC見たいなことできるの?
212デフォルトの名無しさん (ワッチョイ 9f79-P7q6)
2019/10/10(木) 21:36:10.47ID:LC0PLrJI0 特化してるUWSCみたいに簡単ではないけど
がんばればできる
がんばればできる
213デフォルトの名無しさん (ワッチョイ 9fda-OHYr)
2019/10/10(木) 21:48:01.84ID:5Xxw1b5M0 頑張れば何でもできるだろうな。
VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。
殆ど屁理屈だけど。
VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。
殆ど屁理屈だけど。
214デフォルトの名無しさん (ワッチョイ 9f59-Sohv)
2019/10/10(木) 22:44:29.41ID:g+4V+XU10 要は徒歩でも世界一周できますよねってこと
215デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/10(木) 23:00:49.96ID:0ZKFmSv+0 ジョジョ、逆に考えるんだ、『vbaの下に便利APIのExcelやAccessが付いているのさ』と考えるんだ
21649 (ワッチョイ f791-mVPP)
2019/10/11(金) 15:44:34.63ID:3jXa2BKX021749 (ワッチョイ f791-mVPP)
2019/10/11(金) 15:50:38.03ID:3jXa2BKX0 ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。
まっ、VBSが最適な話なら結局使うけどね。
VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
まっ、VBSが最適な話なら結局使うけどね。
VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
218デフォルトの名無しさん (ワッチョイ 9fa2-8cCB)
2019/10/11(金) 17:59:50.09ID:l8XLJu9S0219デフォルトの名無しさん (ワッチョイ b74b-x3kW)
2019/10/11(金) 18:32:21.51ID:cTW5CNRi0 特定のアプリのウィンドウに対してキー入力するとかVBAでやってるよ
220デフォルトの名無しさん (ブーイモ MMcf-4N8v)
2019/10/11(金) 20:26:26.20ID:WXbKDhhqM Cells(1,"A")と書かず、判りにくいCells(1,1)と書くのはなぜ?
ネットの記述とか見ててもCells(1,"A")と書いてるの見たこと無い
ネットの記述とか見ててもCells(1,"A")と書いてるの見たこと無い
221デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/11(金) 20:52:13.81ID:zntJ+vZ40 マルチかよw
222デフォルトの名無しさん (ワッチョイ b7ce-NJTS)
2019/10/11(金) 22:18:32.49ID:thcocK/e0 はわわ〜
223デフォルトの名無しさん (アウアウエー Sadf-UHnC)
2019/10/11(金) 23:28:47.56ID:CLF8jhxua RPAは所詮VBAに勝てないか
っしゃああ
っしゃああ
224デフォルトの名無しさん (ワッチョイ 9fa2-8cCB)
2019/10/12(土) 02:44:28.24ID:o9i+oJev0 forでまわせんだろうが
個人的にrangeをなぜ使うかの方がわからん
個人的にrangeをなぜ使うかの方がわからん
225デフォルトの名無しさん (ワッチョイ 9fa2-8cCB)
2019/10/12(土) 02:45:37.39ID:o9i+oJev0 ああ、cellsで表現できるのをrangeで表現するのが解らんってことね
226デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/12(土) 06:05:16.65ID:ghJl2hig0 Range("B2:E6").Interior.Color = 65535
こんな場合は使うかな
見た目というかデータに影響を与えない部分はrangeの方が読みやすい、気がする
こんな場合は使うかな
見た目というかデータに影響を与えない部分はrangeの方が読みやすい、気がする
227デフォルトの名無しさん (ワッチョイ 9f01-8cCB)
2019/10/12(土) 06:55:20.10ID:aSZCz9kN0 朕も同じくだわ
228デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/12(土) 11:15:14.28ID:Wxq9g5aB0 Cells(1, "a")と書くならRangeを使えばいい
229デフォルトの名無しさん (スフッ Sdbf-hY6M)
2019/10/12(土) 11:19:09.64ID:cp8dvw0gd マルチする迷惑な質問者多いな…
230デフォルトの名無しさん (ブーイモ MMfb-4N8v)
2019/10/12(土) 11:58:45.65ID:6ww4xfxmM 繰り返すときCells(i, 1)よりCells(i, "A")の方が判りやすいと思うけど
231デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/12(土) 12:34:57.54ID:ghJl2hig0 列方向に繰り返す時はどうするの
232デフォルトの名無しさん (ブーイモ MMcf-olh0)
2019/10/12(土) 12:37:13.83ID:O9HuO9geM むしろexcel側でR1C1形式がデフォルトになれば良いのに
233デフォルトの名無しさん (ワッチョイ 9f4b-x3kW)
2019/10/12(土) 12:44:34.65ID:9l3IvWTz0 列は作りながら足したり順番変えたりする事が多いので最初からenum作って管理する
cells(i, cols.hoge)みたいにしてる
cells(i, cols.hoge)みたいにしてる
234デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/12(土) 12:46:15.93ID:ghJl2hig0235デフォルトの名無しさん (ワッチョイ 97da-NJTS)
2019/10/12(土) 19:24:53.26ID:E5CVP1ep0 アホか
236デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/12(土) 20:28:16.78ID:grx7Z1qlx 経験則から言うと、エクセルのシートを入力フォームや書類のフォーマットのように捉えてる人はRangeを使いがちで、配列やテーブルとして扱えるオブジェクトの塊だと捉えてる人はCellsを使う傾向がある
237デフォルトの名無しさん (ワッチョイ bfad-la4p)
2019/10/13(日) 00:25:27.70ID:ZLXCWom40 あるリストをユーザーフォームで絞り込んでそのユーザーフォームのリストボックスに
リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示
先がうまく表示されません。どうしたらいいでしょうか?
以下がコードです
private Sub kensaku_bo_Click()
'オートフィルタによる検索
Dim ws_kiki As Worksheet
Set ws_kiki = Worksheets("機器履歴")
Dim tateya As String '建屋番号
Dim gouki As String '号機番号
Dim gouki2 As String '建屋と号機の合計のセル
Dim haihhun As String
Dim myData As Variant
tateya = ken1.Value
gouki = ken2.Value
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
ws_kiki.Range("A1").AutoFilter 3, gouki2
Dim lastRow As Long
With ws_kiki
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 12).End(xlUp)).Value
End With
With list_ken
.ColumnCount = 12
.ColumnWidths = "50;80;50;50;50;50;50;50;50;50;50;50"
.List = myData
End With End Sub
リスト内容を表示させたいのですがオートフィルタの表示はうまくいくってるのですがリストの表示
先がうまく表示されません。どうしたらいいでしょうか?
以下がコードです
private Sub kensaku_bo_Click()
'オートフィルタによる検索
Dim ws_kiki As Worksheet
Set ws_kiki = Worksheets("機器履歴")
Dim tateya As String '建屋番号
Dim gouki As String '号機番号
Dim gouki2 As String '建屋と号機の合計のセル
Dim haihhun As String
Dim myData As Variant
tateya = ken1.Value
gouki = ken2.Value
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
ws_kiki.Range("A1").AutoFilter 3, gouki2
Dim lastRow As Long
With ws_kiki
lastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 12).End(xlUp)).Value
End With
With list_ken
.ColumnCount = 12
.ColumnWidths = "50;80;50;50;50;50;50;50;50;50;50;50"
.List = myData
End With End Sub
238デフォルトの名無しさん (ワッチョイ b7ce-NJTS)
2019/10/13(日) 04:36:36.74ID:PQpo0fQ70 変数で回す時はCells
セル位置が固定の時、範囲指定する時はRange
1行ごとにコード入力が楽な方を選んでる
セル位置が固定の時、範囲指定する時はRange
1行ごとにコード入力が楽な方を選んでる
239デフォルトの名無しさん (ワッチョイ bff7-n5Mu)
2019/10/13(日) 09:40:37.82ID:EzRorSmA0240デフォルトの名無しさん (ワッチョイ bff7-n5Mu)
2019/10/13(日) 09:49:37.23ID:EzRorSmA0 間違えたmyDataは配列か
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
241デフォルトの名無しさん (ワッチョイ 1fba-7XqI)
2019/10/13(日) 15:30:11.40ID:8j4dObBs0 セルC5:C17に数値が入ってます(A)
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)
AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです
cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします
初心者です
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)
AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです
cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします
初心者です
242デフォルトの名無しさん (ワッチョイ b74b-x3kW)
2019/10/13(日) 15:41:29.73ID:tc/0x//C0 配列を検索すればいいだけでは
243デフォルトの名無しさん (ワッチョイ 1fba-7XqI)
2019/10/13(日) 15:45:58.47ID:8j4dObBs0244デフォルトの名無しさん (スフッ Sdbf-Sohv)
2019/10/13(日) 16:03:13.56ID:TBfrTFPMd 配列よりコレクションの方が楽では
245デフォルトの名無しさん (ワッチョイ b74b-x3kW)
2019/10/13(日) 16:05:31.06ID:tc/0x//C0 for i = 0 to ubound(配列)
if 配列(i) <> 検索したい値 then
どこかに出力
end if
next
こういう感じでいいんじゃないの
if 配列(i) <> 検索したい値 then
どこかに出力
end if
next
こういう感じでいいんじゃないの
246デフォルトの名無しさん (ワッチョイ 1fba-7XqI)
2019/10/13(日) 16:45:22.08ID:8j4dObBs0247デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/13(日) 18:24:09.39ID:0JmSqCe7x 普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
248デフォルトの名無しさん (アウアウウー Sa5b-Cvo3)
2019/10/13(日) 20:43:23.01ID:2Iz5cpana Dictionaryは平均的なVBAerには理解できないから却下
他人に理解できないもん作るんならVBAを選ぶ意味がない
他人に理解できないもん作るんならVBAを選ぶ意味がない
249デフォルトの名無しさん (ワッチョイ 9f4b-x3kW)
2019/10/13(日) 21:17:01.40ID:GzZlIE9V0 dictionary楽なのに
250デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/13(日) 21:32:01.32ID:z6dVpON+0 連想配列の事をdictionaryって呼ぶんだっけか
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
251デフォルトの名無しさん (アウアウエー Sadf-UHnC)
2019/10/13(日) 21:38:36.38ID:a37CwINqa みんなどうやってVBAそんなに詳しくなったの?
252デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/13(日) 21:44:04.10ID:exOKfr5u0 必要に迫られて作ってるうちに
253デフォルトの名無しさん (ワッチョイ 9f59-Sohv)
2019/10/13(日) 21:48:31.98ID:TUjSthkJ0 休日まで費やして2000行くらいコード書いてるけどそろそろ嫌になってきた
254デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/13(日) 21:50:43.69ID:z6dVpON+0 そのうち、休日に働いて会社でのんびりするようになるよ
あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな
あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな
255デフォルトの名無しさん (アウアウエー Sadf-UHnC)
2019/10/13(日) 21:54:03.90ID:a37CwINqa >>254
あー、すごいよくわかる
あー、すごいよくわかる
256デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/13(日) 22:03:41.31ID:0JmSqCe7x >>248
平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの?
平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの?
257デフォルトの名無しさん (ワッチョイ b74b-x3kW)
2019/10/13(日) 22:05:54.29ID:VDajUcWs0 dictionaryの替わりにシートを使うという発想は無かったな
258デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/13(日) 22:13:33.97ID:0JmSqCe7x シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
259デフォルトの名無しさん (ワッチョイ f768-NJTS)
2019/10/13(日) 22:23:41.04ID:z6dVpON+0 >>258
まぁねぇ。その辺は考えながらうまく付き合って行きたい所
まぁねぇ。その辺は考えながらうまく付き合って行きたい所
260デフォルトの名無しさん (ワッチョイ 9fa2-8cCB)
2019/10/13(日) 22:44:44.65ID:Sc8Blp8e0 連想配列ってどういうとき便利なの?
いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど
いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど
261デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/13(日) 23:07:03.97ID:exOKfr5u0262デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
2019/10/13(日) 23:09:26.19ID:YeAfr+Aea >>241
こういうこと?
Sub 検索()
Const COL_C As Long = 3
Const COL_F As Long = 6
Const COL_O As Long = 15
Dim nSetRow As Long
nSetRow = 5
Dim nRow As Long
For nRow = 5 To 17
If Not IsExistValue(Cells(nRow, COL_C).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_C).Value
nSetRow = nSetRow + 1
End If
Next
For nRow = 5 To 21
If Not IsExistValue(Cells(nRow, COL_F).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_F).Value
nSetRow = nSetRow + 1
End If
Next
End Sub
こういうこと?
Sub 検索()
Const COL_C As Long = 3
Const COL_F As Long = 6
Const COL_O As Long = 15
Dim nSetRow As Long
nSetRow = 5
Dim nRow As Long
For nRow = 5 To 17
If Not IsExistValue(Cells(nRow, COL_C).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_C).Value
nSetRow = nSetRow + 1
End If
Next
For nRow = 5 To 21
If Not IsExistValue(Cells(nRow, COL_F).Value) Then
Cells(nSetRow, COL_O).Value = Cells(nRow, COL_F).Value
nSetRow = nSetRow + 1
End If
Next
End Sub
263デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
2019/10/13(日) 23:09:42.80ID:YeAfr+Aea Function IsExistValue(ByVal pValue As Variant) As Boolean
IsExistValue = True
Const COL_Y As Long = 25
Dim nRow As Long
For nRow = 5 To 25
If Cells(nRow, COL_Y).Value = pValue Then
Exit Function
End If
Next
IsExistValue = False
End Function
IsExistValue = True
Const COL_Y As Long = 25
Dim nRow As Long
For nRow = 5 To 25
If Cells(nRow, COL_Y).Value = pValue Then
Exit Function
End If
Next
IsExistValue = False
End Function
264デフォルトの名無しさん (ワッチョイ 9fea-+Z1Z)
2019/10/13(日) 23:20:25.51ID:rkAEaYhN0 >>260
Keywordが重複できないから必ず一意なデータセットができる。
Keywordが重複できないから必ず一意なデータセットができる。
265デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
2019/10/14(月) 00:48:24.78ID:2bLpiP0X0 2シートを連結する際、それぞれの各行をクラスインスタンスに代入&コレクション化してるのですが連結方法に悩んでいます
例
Personクラス(pID, 氏名, 名字プロパティ, 生年月日,...)→Persons.Add Personインスタンス, str(pID)
Diaryクラス(dID, pID, 作成日, 本文,...)→Diaries.Add Diaryインスタンス, str(dID)
'出力
Dim d as Diary
For each d in Diaries
if(存在チェック) then xxx = Persons.Item(d.pID).名字
Next d
現在上記のように回してますが、より楽に書けるor固いor保守しやすい...実装があれば教えて頂きたいです
現状はプロパティの予測表示がされないのが微妙に使いにくいのと、そもそもコレクションにおけるkeyの動作をよく分かっていません
例
Personクラス(pID, 氏名, 名字プロパティ, 生年月日,...)→Persons.Add Personインスタンス, str(pID)
Diaryクラス(dID, pID, 作成日, 本文,...)→Diaries.Add Diaryインスタンス, str(dID)
'出力
Dim d as Diary
For each d in Diaries
if(存在チェック) then xxx = Persons.Item(d.pID).名字
Next d
現在上記のように回してますが、より楽に書けるor固いor保守しやすい...実装があれば教えて頂きたいです
現状はプロパティの予測表示がされないのが微妙に使いにくいのと、そもそもコレクションにおけるkeyの動作をよく分かっていません
266デフォルトの名無しさん (ワッチョイ 9f4b-x3kW)
2019/10/14(月) 01:24:56.78ID:wVIK+1B50267デフォルトの名無しさん (ワッチョイ bf68-NJTS)
2019/10/14(月) 09:29:31.58ID:+oSE7p5I0 VBAでOPENしたファイルを引数で渡す事は出来ますか?
こんな感じで処理したいのですが、「#1」って変数では無いのでしょうか
Sub foo()
Open "TESTFILE" For Output As #1 ' Open file for output.
Call write_(#1,"content")
Close #1
End Sub
Function write_(filenumber, content)
Write filenumber, content
End Function
こんな感じで処理したいのですが、「#1」って変数では無いのでしょうか
Sub foo()
Open "TESTFILE" For Output As #1 ' Open file for output.
Call write_(#1,"content")
Close #1
End Sub
Function write_(filenumber, content)
Write filenumber, content
End Function
268デフォルトの名無しさん (ワッチョイ 9fda-OHYr)
2019/10/14(月) 09:38:41.74ID:LU4QFSeP0269デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
2019/10/14(月) 12:22:02.07ID:UlmNQm1da >>267
ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
270デフォルトの名無しさん (ワッチョイ bf68-NJTS)
2019/10/14(月) 12:27:42.70ID:+oSE7p5I0 >>269
行けました!ありがとうございます
ナンバー記号「#」の詳細ってMSDNかどこかにありますか?
Sub foo()
Dim nNo As Integer
nNo = FreeFile
Open "TESTFILE" For Output As nNo ' Open file for output.
Call write_(nNo, "conteaasnt")
Close #1
End Sub
Function write_(nNo, content)
Write #nNo, content
End Function
行けました!ありがとうございます
ナンバー記号「#」の詳細ってMSDNかどこかにありますか?
Sub foo()
Dim nNo As Integer
nNo = FreeFile
Open "TESTFILE" For Output As nNo ' Open file for output.
Call write_(nNo, "conteaasnt")
Close #1
End Sub
Function write_(nNo, content)
Write #nNo, content
End Function
271デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/14(月) 14:39:32.50ID:aC+4aHxsx >>265
Persons、Diariesをコレクションにしている理由は、「Person、Diaryという2つのカスタムクラスの集合オブジェクト」という意味論以外に、何か実装的な理由はあるのかな?
例えば、2つのコレクションクラスに格納するデータの型が一様でないからCollectionじゃないとリスト化できないとか、多態のためにCollectionクラスをインターフェース継承させているとか
そういう事情がないならば、Keyの存在確認手段を持たないCollectionクラスではなく、Keyの存在確認を行うExistsメソッドを持つDictionaryを使うのが実装的には楽だと思う
pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
そもそもRemoveやAddといった基本的な機能はCollectionとDictionaryとで共通しているし、Dictionaryの方が動作も早いしね
Persons、Diariesをコレクションにしている理由は、「Person、Diaryという2つのカスタムクラスの集合オブジェクト」という意味論以外に、何か実装的な理由はあるのかな?
例えば、2つのコレクションクラスに格納するデータの型が一様でないからCollectionじゃないとリスト化できないとか、多態のためにCollectionクラスをインターフェース継承させているとか
そういう事情がないならば、Keyの存在確認手段を持たないCollectionクラスではなく、Keyの存在確認を行うExistsメソッドを持つDictionaryを使うのが実装的には楽だと思う
pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
そもそもRemoveやAddといった基本的な機能はCollectionとDictionaryとで共通しているし、Dictionaryの方が動作も早いしね
272デフォルトの名無しさん (アウアウウー Sa5b-8cCB)
2019/10/14(月) 14:43:11.09ID:ghhHmrX1a273デフォルトの名無しさん (スプッッ Sddf-NJTS)
2019/10/14(月) 15:37:37.47ID:g9W5x9G3d 言語リファレンスでも#は省略可能となっているだけで、説明はどこにも見当たらない
古いBASICとの互換性で残してあるだけだと思う
古いBASICとの互換性で残してあるだけだと思う
274デフォルトの名無しさん (ワッチョイ bf68-NJTS)
2019/10/14(月) 15:51:24.60ID:+oSE7p5I0 >>272-273
あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
275デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
2019/10/14(月) 15:54:12.83ID:2bLpiP0X0 >>271
ありがとうございます
コレクションを選択した理由は特にありません
(あえて挙げるなら、コレクションにまとめるリファレンスが最初に目に付いた です)
>pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
言葉足らずですみません。Diaryクラス側ではpIDが重複しdIDが主キーとなるので、一意に取得できません。(この認識も間違っていたらすみません...)
エラー処理がExistsで済むのは明確なメリットですね。Collectionでは、調べた限りではOnErrorGoToで飛ばす方法しか見つけられませんでした
ひとまず、Diary側のループで取得したpIDでPersonDictionaryにExistsをかける 方法を試してみようと思います。
ありがとうございます
コレクションを選択した理由は特にありません
(あえて挙げるなら、コレクションにまとめるリファレンスが最初に目に付いた です)
>pID・Person、pID・Diaryの二種類のペアに対応するDictionaryを個別に作ってpIDでリレーション確認するイメージ(各DictionaryではpIDをKeyとしておく)
言葉足らずですみません。Diaryクラス側ではpIDが重複しdIDが主キーとなるので、一意に取得できません。(この認識も間違っていたらすみません...)
エラー処理がExistsで済むのは明確なメリットですね。Collectionでは、調べた限りではOnErrorGoToで飛ばす方法しか見つけられませんでした
ひとまず、Diary側のループで取得したpIDでPersonDictionaryにExistsをかける 方法を試してみようと思います。
276デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/14(月) 16:00:13.52ID:pMfnFO5+0 >>274
#1の中身は文字列じゃないよ
#1の中身は文字列じゃないよ
277デフォルトの名無しさん (ワッチョイ 9f01-Kkga)
2019/10/14(月) 16:32:13.39ID:9SF/tSaH0278デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/14(月) 17:26:42.75ID:J7mWSp9Bx >>275
複数のDiaryインスタンスが共通のpIDを持つならば、連結を二重化したらいいんじゃないだろうか
まずpIDをキーとするDiary用のDictionaryをまず作っておいて、
同じpIDを持つDiaryインスタンスをまとめたDictionaryかCollectionをItemとして持たせる形にすればいいと思う
構造的に表すと
(Key[i] = pID, Item[i] = (Key[j] = dID, Item[j] = Diary))
みたいな感じ
複数のDiaryインスタンスが共通のpIDを持つならば、連結を二重化したらいいんじゃないだろうか
まずpIDをキーとするDiary用のDictionaryをまず作っておいて、
同じpIDを持つDiaryインスタンスをまとめたDictionaryかCollectionをItemとして持たせる形にすればいいと思う
構造的に表すと
(Key[i] = pID, Item[i] = (Key[j] = dID, Item[j] = Diary))
みたいな感じ
279デフォルトの名無しさん (ワッチョイ bfad-la4p)
2019/10/14(月) 22:48:09.17ID:PwgP8aUB0 VBAで表からその左の行を検索したいのですがどうしたらいいでしょうか?
Dim rng As Range
Set rng = ws_siriaru.Range("D:L").Find(ken4, LookAt:=xlWhole)
If rng Is Nothing Then rng
MsgBox ""ない
Exit Sub
End If
siriaru = Range("C" & rng.Row).Value
gouki = siriaru
label_siri = gouki
では表示はされるのですがうまくいきませんでした。
Dim rng As Range
Set rng = ws_siriaru.Range("D:L").Find(ken4, LookAt:=xlWhole)
If rng Is Nothing Then rng
MsgBox ""ない
Exit Sub
End If
siriaru = Range("C" & rng.Row).Value
gouki = siriaru
label_siri = gouki
では表示はされるのですがうまくいきませんでした。
280デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
2019/10/14(月) 23:16:54.59ID:2bLpiP0X0281デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/15(火) 00:00:45.56ID:Nq3iWAMG0 >>279
説明する時「うまくいく」とか「うまくいかない」という単語は使ってはいけない
説明する時「うまくいく」とか「うまくいかない」という単語は使ってはいけない
282デフォルトの名無しさん (ワッチョイ 9fe0-o74w)
2019/10/15(火) 00:02:27.41ID:0b9bW6T40 >>279
どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?
Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入
という点ではプログラムに間違いはありません
どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?
Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入
という点ではプログラムに間違いはありません
283デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/15(火) 00:30:22.92ID:i09LlRYux >>280
その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
284デフォルトの名無しさん (オッペケ Srcb-FpGY)
2019/10/15(火) 04:19:47.75ID:/i2LKWgur >>279
siriaru=ws_siriaru.Range("C" & rng.Row).Value
siriaru=ws_siriaru.Range("C" & rng.Row).Value
285デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/15(火) 08:12:41.36ID:/HnZFUztx >>279
siriaruに値を代入するときに参照しているシートがシリアルのシートじゃなくて別シートになってると思う
siriaru = ws_siriaru.Range("C" & rng.Row).Value
に変えたらうまくいくのでは
siriaruに値を代入するときに参照しているシートがシリアルのシートじゃなくて別シートになってると思う
siriaru = ws_siriaru.Range("C" & rng.Row).Value
に変えたらうまくいくのでは
286デフォルトの名無しさん (アウアウウー Sa5b-ueyd)
2019/10/15(火) 18:45:11.44ID:opa9jcIha >>270
close もopenと同じ番号のnNo によ
close もopenと同じ番号のnNo によ
287デフォルトの名無しさん (オッペケ Srcb-jOzB)
2019/10/15(火) 21:12:27.40ID:OH7oWYO6r >>236
最初からVariantに入れるのが正解では?
最初からVariantに入れるのが正解では?
288デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/15(火) 21:28:52.40ID:NB8YI5GFx >>287
Variant型は便利だけどRangeオブジェクトを突っ込むためだけの変数で使用するにはねぇ
実際のデータ型を明示しないぶんコードが読みにくくなるしコーティング時にインテリセンスも利かなかったりとデメリットの方が目立つ
実行時エラーの原因って感じ
Variant型は便利だけどRangeオブジェクトを突っ込むためだけの変数で使用するにはねぇ
実際のデータ型を明示しないぶんコードが読みにくくなるしコーティング時にインテリセンスも利かなかったりとデメリットの方が目立つ
実行時エラーの原因って感じ
289デフォルトの名無しさん (ワッチョイ bfad-la4p)
2019/10/15(火) 22:36:34.14ID:LwOOuMgG0 リストの表示について
以下の表示の際最終行後ろのセルが空白だった場合最終行が表示されません。
なぜでしょうか?
LastRowではA列の最終行を指定しているので間違いではないと思うのですが
最終行のみ全てのセルに数値を入れていないと最終行に反映されないみたいです;。
With ws_kiki
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value
End With
With list_ken
.ColumnCount = 13
.ColumnWidths = "20;60;50;50;50;70;70;50;50;50;50;50"
.List = myData
以下の表示の際最終行後ろのセルが空白だった場合最終行が表示されません。
なぜでしょうか?
LastRowではA列の最終行を指定しているので間違いではないと思うのですが
最終行のみ全てのセルに数値を入れていないと最終行に反映されないみたいです;。
With ws_kiki
LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 13).End(xlUp)).Value
End With
With list_ken
.ColumnCount = 13
.ColumnWidths = "20;60;50;50;50;70;70;50;50;50;50;50"
.List = myData
290デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/15(火) 22:58:43.53ID:Nq3iWAMG0 >>289
M列で値が入ってる一番下のセルまでが範囲のようだが
M列で値が入ってる一番下のセルまでが範囲のようだが
291デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/15(火) 23:33:50.79ID:NB8YI5GFx >>289
あなたsiriaruの人でしょ
もういい加減お金払って誰かに教えてもらうか、MSDNのVBAのリファレンスを読み込んできちんと勉強すべきだとおもうよ
会社で使ってるマクロのコードベタ貼りしてるのも本当に宜しくない
今回の問題は、せっかくLastRowにA列の使用セルの最終行の行インデックスを格納しているのに、myDataに入れる値のセル範囲指定でそのLastRowの値を使っていないことが原因でしょ
自分の頭をちゃんと使って書いてる?
myData = .Range(.Cells(1, 1), .Cells(LastRow, 13)).Value
と書き直せば終わり
あなたsiriaruの人でしょ
もういい加減お金払って誰かに教えてもらうか、MSDNのVBAのリファレンスを読み込んできちんと勉強すべきだとおもうよ
会社で使ってるマクロのコードベタ貼りしてるのも本当に宜しくない
今回の問題は、せっかくLastRowにA列の使用セルの最終行の行インデックスを格納しているのに、myDataに入れる値のセル範囲指定でそのLastRowの値を使っていないことが原因でしょ
自分の頭をちゃんと使って書いてる?
myData = .Range(.Cells(1, 1), .Cells(LastRow, 13)).Value
と書き直せば終わり
292デフォルトの名無しさん (ワッチョイ f77c-h29T)
2019/10/16(水) 00:02:02.46ID:TVv1yadl0 この人の問題は質問内容よりも質問文が意味不明なこと
状況を全く何も知らない相手に説明するということを考えながら質問文を書くようにしよう
状況を全く何も知らない相手に説明するということを考えながら質問文を書くようにしよう
293デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/16(水) 00:19:19.45ID:GI0GqC4Qx こういう構造的思考力のない人がコピペ&コピペで作り上げた野良マクロが企業の負債になっていくんだよね
294デフォルトの名無しさん (ワッチョイ 9f4b-x3kW)
2019/10/16(水) 00:30:12.53ID:4U9etGee0 ワークシートのスクリーンショットとか図で説明してもらわないと訳がわからない
295デフォルトの名無しさん (ワッチョイ 9f4f-aOdU)
2019/10/16(水) 07:23:15.57ID:Qp+et4KT0 .Net系もやってる人に質問です
列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど
アレをVBAで行う方法は有りますか?
Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど
アレをVBAで行う方法は有りますか?
Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
296デフォルトの名無しさん (アークセー Sxcb-FpGY)
2019/10/16(水) 08:23:24.91ID:GI0GqC4Qx >>295
構造体配列とかクラスとかで擬似的に再現するしかないんじゃないの
構造体配列とかクラスとかで擬似的に再現するしかないんじゃないの
297デフォルトの名無しさん (アウアウウー Sa5b-Cvo3)
2019/10/16(水) 08:32:09.52ID:M09TXdK2a298デフォルトの名無しさん (ドコグロ MM8b-Kkga)
2019/10/16(水) 12:35:11.58ID:IY04c/q/M299295 (ササクッテロ Spcb-aOdU)
2019/10/16(水) 12:54:37.89ID:swoRisr+p >>296
そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。
構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。
>>297
どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。
構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。
>>297
どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
■ このスレッドは過去ログ倉庫に格納されています
