Excel VBA 質問スレ Part63

■ このスレッドは過去ログ倉庫に格納されています
2019/09/16(月) 19:34:59.04ID:emfTAhXr0
!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
200デフォルトの名無しさん (アメ MM11-pTrw)
垢版 |
2019/10/08(火) 07:37:46.07ID:wEzHRAYiM
〉〉196です。
変数名もそんなルールが?
なんとなく日本語はよくないなーと思って自分で分かるローマ字で表記しようと思ったんですが、後ダメな理由がマッチ関数にワークシート指定してないからかと推察。後で試します。
2019/10/08(火) 07:52:03.60ID:o1U1FjwuM
無理に英語やローマ字にするくらいなら日本語でいいと思うけど
あとrangeだけじゃなくてcellsも覚えれば目的達成するんじゃないか
cellsのrowとcolumnで行と列を取得出来るからね
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をメソッド化する

どちらもコーディングや保守の工数は大して変わらない
2019/10/08(火) 20:03:58.77ID:XnwML2Ug0
>>202
>ただ単にマクロ一覧に表示されないようにしたいだけなら、Private SubをPublic Subに変えた上で、そのモジュールの先頭にOption Private Moduleと書き加えれば良い
まさにこれです!privateにしなくても出来たんですね、勉強になりました。ありがとうございました

他の方法も勉強になりました
2019/10/08(火) 20:07:56.35ID:Uz+DmrF+0
>>200
決まった名前ルールは無い
人それぞれに拘りがあるだけ
たぶんみんなに共通する拘りは分かり易さ
他人が見て混乱しないか、半年後に自分が見てすぐに理解できるか
205デフォルトの名無しさん (ワッチョイ 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行目を指定するのは難しそう
2019/10/08(火) 22:10:00.62ID:QtXyLjSg0
伝え方って大事だよね
2019/10/08(火) 22:11:56.81ID:Uz+DmrF+0
>>206
21行目になったら次の改ページ位置を貼り付け先にする
2019/10/08(火) 22:13:49.93ID:Uz+DmrF+0
または上下の題名をヘッダフッタに指定して改ページを気にせず貼り付ける
2019/10/08(火) 22:46:38.31ID:IntPDsvb0
>>194
出来ました。大変ありがとう😊
2019/10/10(木) 21:20:24.18ID:gS7zDweR0
たまにpowershellの話題出るから聞きたいんだけどpowershellってUWSC見たいなことできるの?
2019/10/10(木) 21:36:10.47ID:LC0PLrJI0
特化してるUWSCみたいに簡単ではないけど
がんばればできる
2019/10/10(木) 21:48:01.84ID:5Xxw1b5M0
頑張れば何でもできるだろうな。

VBSではWindowsAPIが使えない! → 裏でこっそりエクセル起動すれば使えるじゃん。
VBAではjavascriptが使えない! → ExecuteThisJavaScript使えば出来るじゃん。

殆ど屁理屈だけど。
2019/10/10(木) 22:44:29.41ID:g+4V+XU10
要は徒歩でも世界一周できますよねってこと
2019/10/10(木) 23:00:49.96ID:0ZKFmSv+0
ジョジョ、逆に考えるんだ、『vbaの下に便利APIのExcelやAccessが付いているのさ』と考えるんだ
2019/10/11(金) 15:44:34.63ID:3jXa2BKX0
>>211
>>212
>>213
出来るぜ。
−応ここVBAのスレだから言うけどVBAでも全部できる。
今流行りのRPAがやってることは全部出来る。
2019/10/11(金) 15:50:38.03ID:3jXa2BKX0
ただ、VBSでWindowsAPIは苦肉の策というか、敬遠したい気持ちもある。
まっ、VBSが最適な話なら結局使うけどね。

VBAでJavaScriptも同様だね。
こっちの方が敬遠したい。
まずはVBAだけで何とかならないかを考える。
2019/10/11(金) 17:59:50.09ID:l8XLJu9S0
>>216
まじかー
vbaでやれるっていうことはwinapiを使うって事だよね?
スクリーン上の指定座標の色の識別とかもできたりするの?
2019/10/11(金) 18:32:21.51ID:cTW5CNRi0
特定のアプリのウィンドウに対してキー入力するとかVBAでやってるよ
2019/10/11(金) 20:26:26.20ID:WXbKDhhqM
Cells(1,"A")と書かず、判りにくいCells(1,1)と書くのはなぜ?
ネットの記述とか見ててもCells(1,"A")と書いてるの見たこと無い
2019/10/11(金) 20:52:13.81ID:zntJ+vZ40
マルチかよw
2019/10/11(金) 22:18:32.49ID:thcocK/e0
はわわ〜
2019/10/11(金) 23:28:47.56ID:CLF8jhxua
RPAは所詮VBAに勝てないか
っしゃああ
2019/10/12(土) 02:44:28.24ID:o9i+oJev0
forでまわせんだろうが
個人的にrangeをなぜ使うかの方がわからん
2019/10/12(土) 02:45:37.39ID:o9i+oJev0
ああ、cellsで表現できるのをrangeで表現するのが解らんってことね
2019/10/12(土) 06:05:16.65ID:ghJl2hig0
Range("B2:E6").Interior.Color = 65535
こんな場合は使うかな
見た目というかデータに影響を与えない部分はrangeの方が読みやすい、気がする
2019/10/12(土) 06:55:20.10ID:aSZCz9kN0
朕も同じくだわ
2019/10/12(土) 11:15:14.28ID:Wxq9g5aB0
Cells(1, "a")と書くならRangeを使えばいい
2019/10/12(土) 11:19:09.64ID:cp8dvw0gd
マルチする迷惑な質問者多いな…
2019/10/12(土) 11:58:45.65ID:6ww4xfxmM
繰り返すときCells(i, 1)よりCells(i, "A")の方が判りやすいと思うけど
2019/10/12(土) 12:34:57.54ID:ghJl2hig0
列方向に繰り返す時はどうするの
2019/10/12(土) 12:37:13.83ID:O9HuO9geM
むしろexcel側でR1C1形式がデフォルトになれば良いのに
2019/10/12(土) 12:44:34.65ID:9l3IvWTz0
列は作りながら足したり順番変えたりする事が多いので最初からenum作って管理する
cells(i, cols.hoge)みたいにしてる
2019/10/12(土) 12:46:15.93ID:ghJl2hig0
>>232
三四郎に対抗するためにこうなった
結果、シェアを勝ち取ったけど負の遺産として残ってしまったね
2019/10/12(土) 19:24:53.26ID:E5CVP1ep0
アホか
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
2019/10/13(日) 04:36:36.74ID:PQpo0fQ70
変数で回す時はCells
セル位置が固定の時、範囲指定する時はRange
1行ごとにコード入力が楽な方を選んでる
2019/10/13(日) 09:40:37.82ID:EzRorSmA0
>>237
myData(Range型)にはフィルター設定情報は入ってない
一行一行をRow.Hidden判定しながら範囲内ループさせて取り込むしかないね
2019/10/13(日) 09:49:37.23ID:EzRorSmA0
間違えたmyDataは配列か
それでもフィルター情報は乗らないね
リストボックスの.RowSourceに範囲アドレス入れて連動させる方法あるけど
これフィルターも連動したっけ?
2019/10/13(日) 15:30:11.40ID:8j4dObBs0
セルC5:C17に数値が入ってます(A)
セルF5:F21に数値が入ってます (B)
セルY5:Y25に数値が入ってます (C)

AとBの数値のうちCにない数値をセルO5から順番に下に抜き出したいんです

cを配列で格納するまでは出来たのですがそれ以降がわかりません
よろしくお願いします

初心者です
2019/10/13(日) 15:41:29.73ID:tc/0x//C0
配列を検索すればいいだけでは
2019/10/13(日) 15:45:58.47ID:8j4dObBs0
>>242
すみません
その配列の検索が上手くいかなくて…
2019/10/13(日) 16:03:13.56ID:TBfrTFPMd
配列よりコレクションの方が楽では
2019/10/13(日) 16:05:31.06ID:tc/0x//C0
for i = 0 to ubound(配列)
if 配列(i) <> 検索したい値 then
どこかに出力
end if
next

こういう感じでいいんじゃないの
2019/10/13(日) 16:45:22.08ID:8j4dObBs0
>>244
コレクションっていうのがあるんですね
調べてみます
ありがとうございます
2019/10/13(日) 18:24:09.39ID:0JmSqCe7x
普通のCollectionや配列よりも、Cの値をKeyにしてDictionaryオブジェクトを作る発想の方がいいと思う
Dictionary.ExistsメソッドでKeyの存在確認ができるからコードが簡単になる
2019/10/13(日) 20:43:23.01ID:2Iz5cpana
Dictionaryは平均的なVBAerには理解できないから却下
他人に理解できないもん作るんならVBAを選ぶ意味がない
2019/10/13(日) 21:17:01.40ID:GzZlIE9V0
dictionary楽なのに
2019/10/13(日) 21:32:01.32ID:z6dVpON+0
連想配列の事をdictionaryって呼ぶんだっけか
すごい便利だけど、シートあるんだからシート使った方がいいんでない?と思う
二次配列が目に見えて編集し放題とか楽ちんすぎる
2019/10/13(日) 21:38:36.38ID:a37CwINqa
みんなどうやってVBAそんなに詳しくなったの?
2019/10/13(日) 21:44:04.10ID:exOKfr5u0
必要に迫られて作ってるうちに
2019/10/13(日) 21:48:31.98ID:TUjSthkJ0
休日まで費やして2000行くらいコード書いてるけどそろそろ嫌になってきた
2019/10/13(日) 21:50:43.69ID:z6dVpON+0
そのうち、休日に働いて会社でのんびりするようになるよ
あんまり良くないんだけど、プログラムは家じゃないと集中して掛けないんだよな
2019/10/13(日) 21:54:03.90ID:a37CwINqa
>>254
あー、すごいよくわかる
2019/10/13(日) 22:03:41.31ID:0JmSqCe7x
>>248
平均的なVBAerってのがどんな層を指してるかちょっと分からないが、Dictionaryが理解できない人ってそもそも配列やCollectionも理解できないんじゃないの?
2019/10/13(日) 22:05:54.29ID:VDajUcWs0
dictionaryの替わりにシートを使うという発想は無かったな
2019/10/13(日) 22:13:33.97ID:0JmSqCe7x
シートが可視化された配列だってのはその通りなんだけど誰でもGUIで簡単に編集できてしまう点が逆に弱点でもある
値の読み書きだけでイベントハンドラに制御が渡るからそもそも重いし
2019/10/13(日) 22:23:41.04ID:z6dVpON+0
>>258
まぁねぇ。その辺は考えながらうまく付き合って行きたい所
2019/10/13(日) 22:44:44.65ID:Sc8Blp8e0
連想配列ってどういうとき便利なの?
いまいち基本書の記述じゃメリットとか使い道とかがイメージできないんだけど
2019/10/13(日) 23:07:03.97ID:exOKfr5u0
>>260
配列で数字の添え字じゃなくて好きなワードを使いたい時に
あとDictionaryの場合は検索がめちゃくちゃ速いから大量データの検索に
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
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
2019/10/13(日) 23:20:25.51ID:rkAEaYhN0
>>260
Keywordが重複できないから必ず一意なデータセットができる。
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の動作をよく分かっていません
2019/10/14(月) 01:24:56.78ID:wVIK+1B50
>>260
existsが便利
数数えたり、行番号取り出したり、キャッシュの管理に使ったり
for eachで中身を全部取り出そうとしたら投入順が保証されないのが少し残念
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
2019/10/14(月) 09:38:41.74ID:LU4QFSeP0
>>254
>>255
ホント。
プログラムに対する理解のないバカ上司とか、
コーディングの真っ最中に、平気でコピー取りを要求してきたりするからな。
2019/10/14(月) 12:22:02.07ID:UlmNQm1da
>>267
ファイル番号は1-255の範囲で常に固定値でやるなら引数で渡さずにどこも#1でいいかと思う
FreeFileって関数があってこれは番号を任意に付番してくれるので
たとえば
Dim nNo as Integer
nNo = FreeFile
Open .... #nNo
って書くこともできる
このnNoを引数に指定してもいいかもね
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
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の方が動作も早いしね
2019/10/14(月) 14:43:11.09ID:ghhHmrX1a
>>270
自分は見たことないですね
なんとなくですが自分は常に#をつける派です
それとcloseも#nNoかと
2019/10/14(月) 15:37:37.47ID:g9W5x9G3d
言語リファレンスでも#は省略可能となっているだけで、説明はどこにも見当たらない
古いBASICとの互換性で残してあるだけだと思う
2019/10/14(月) 15:51:24.60ID:+oSE7p5I0
>>272-273
あれ、じゃあなんでしょうねこれ
コンソールで
?#1
ではエラーになるので、ただの数値ではなくなるみたい
#1=2
も出来ない。なんとなくリテラルか参照っぽいですが、何でしょうね
openなどの時にしか使えないのでしょうか
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をかける 方法を試してみようと思います。
2019/10/14(月) 16:00:13.52ID:pMfnFO5+0
>>274
#1の中身は文字列じゃないよ
2019/10/14(月) 16:32:13.39ID:9SF/tSaH0
>>274
> openなどの時にしか使えないのでしょうか
そう言うことだろ
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))

みたいな感じ
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
では表示はされるのですがうまくいきませんでした。
2019/10/14(月) 23:16:54.59ID:2bLpiP0X0
>>278
重ねてありがとうございます。

なるほど。Dictionaryの各要素を、そのkeyに対応するインスタンスの集合とするんですね
1key対1レコード という考えしか無かったので目から鱗です
2019/10/15(火) 00:00:45.56ID:Nq3iWAMG0
>>279
説明する時「うまくいく」とか「うまくいかない」という単語は使ってはいけない
2019/10/15(火) 00:02:27.41ID:0b9bW6T40
>>279
どういった表示がされて、実際に欲しい情報とどこが違うでしょうか?

Range("D:L")をken4で完全一致検索をかけ、最初に見つかったセルの行番号を取得
その行のC列セルの値をsiriaruに代入

という点ではプログラムに間違いはありません
2019/10/15(火) 00:30:22.92ID:i09LlRYux
>>280
その通り
そのようにすれば、Diaryのインスタンス集合全体に対してpIDの存在確認をすることも出来るし、pID, dIDという2つのプロパティ値を使って目的のDiaryオブジェクトを取り出すこともできる
2019/10/15(火) 04:19:47.75ID:/i2LKWgur
>>279
siriaru=ws_siriaru.Range("C" & rng.Row).Value
2019/10/15(火) 08:12:41.36ID:/HnZFUztx
>>279
siriaruに値を代入するときに参照しているシートがシリアルのシートじゃなくて別シートになってると思う
siriaru = ws_siriaru.Range("C" & rng.Row).Value
に変えたらうまくいくのでは
2019/10/15(火) 18:45:11.44ID:opa9jcIha
>>270
close もopenと同じ番号のnNo によ
2019/10/15(火) 21:12:27.40ID:OH7oWYO6r
>>236
最初からVariantに入れるのが正解では?
2019/10/15(火) 21:28:52.40ID:NB8YI5GFx
>>287
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
2019/10/15(火) 22:58:43.53ID:Nq3iWAMG0
>>289
M列で値が入ってる一番下のセルまでが範囲のようだが
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

と書き直せば終わり
2019/10/16(水) 00:02:02.46ID:TVv1yadl0
この人の問題は質問内容よりも質問文が意味不明なこと
状況を全く何も知らない相手に説明するということを考えながら質問文を書くようにしよう
2019/10/16(水) 00:19:19.45ID:GI0GqC4Qx
こういう構造的思考力のない人がコピペ&コピペで作り上げた野良マクロが企業の負債になっていくんだよね
2019/10/16(水) 00:30:12.53ID:4U9etGee0
ワークシートのスクリーンショットとか図で説明してもらわないと訳がわからない
2019/10/16(水) 07:23:15.57ID:Qp+et4KT0
.Net系もやってる人に質問です
列挙体に属性付けて指定すると数値の他に定義した文字列返す方法があると思うんですけど
アレをVBAで行う方法は有りますか?
Constで定義すれば出来ないことは無いんですがなんかダサくて・・・
2019/10/16(水) 08:23:24.91ID:GI0GqC4Qx
>>295
構造体配列とかクラスとかで擬似的に再現するしかないんじゃないの
2019/10/16(水) 08:32:09.52ID:M09TXdK2a
>>295
どうでもいいだろ
VBAなんか使ってること自体が恥辱なのに何を今更
2019/10/16(水) 12:35:11.58ID:IY04c/q/M
>>295
簡単には無理でしょ
.NETも取得するのはそれなりに面倒だし
2019/10/16(水) 12:54:37.89ID:swoRisr+p
>>296
そのためにクラスを作るとVBAの場合はひとクラス1モジュールファイルを切らないといけないし、
フォルダ分けも出来ないので、クラスを作る方法は後々クラスファイルが煩雑になる可能性があるのでやめておきます。

構造体や配列を使うのは少し大掛かりな気もしますが、お陰で何となくイメージがわきました。
DictionaryとかCollectionとかのValueペアのオブジェクトを使って、key側にenumで使用している番号、
Value側に文字列を設定して、enumに紐付けてやるような感じでやろうかなと。
ただ、修正が入るときに手間が掛かるようだとあまり意味がないのでその辺の構成は気をつけて作るような
感じですかね。ありがとうございました。

>>297
どんな言語だろうと自分なりに構成を考えて作っていくのは大事だと思いますよ。
今回の件は無理して作る程のものではありませんが
きちんと部品化しておけばまた違った局面で使うことが出来るので、
自分のためにも、引き継ぐ人のためにも大事だと思います。それはどの言語でも同じでしょう。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。