!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ
ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ
※前スレ
Excel VBA 質問スレ Part70
https://mevius.5ch.net/test/read.cgi/tech/1616072923/
Excel VBA 質問スレ Part71
https://mevius.5ch.net/test/read.cgi/tech/1621914481/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
Excel VBA 質問スレ Part72
レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん (スププ Sdaa-x2SP)
2021/07/18(日) 08:42:15.37ID:KskL7bEXd882デフォルトの名無しさん (ワッチョイ df2f-8qru)
2021/09/07(火) 13:38:20.09ID:7P2mUzTw0 それ、どこからの相対パスが欲しいんだよ?
自分自身から自分自身への相対パスなら、全部.\だから
たんにファイル名だけ表示させればいいんじゃね
汎用的に真面目な相対パスに変換しようと思ったら結構邪魔くさいな
まあこういうのは大概すでに誰かがやってる
VB.NETだが
https://dobon.net/vb/dotnet/file/getabsolutepath.html#pathrelativepathto
とか。API呼び出しでやる方法もそこにある
自分自身から自分自身への相対パスなら、全部.\だから
たんにファイル名だけ表示させればいいんじゃね
汎用的に真面目な相対パスに変換しようと思ったら結構邪魔くさいな
まあこういうのは大概すでに誰かがやってる
VB.NETだが
https://dobon.net/vb/dotnet/file/getabsolutepath.html#pathrelativepathto
とか。API呼び出しでやる方法もそこにある
883デフォルトの名無しさん (ワッチョイ 27da-KOX5)
2021/09/07(火) 15:24:56.80ID:LRYELwZL0 >>881
表示だけでは絶対パスがわからないのでTooltipは必要ですよね。
表示をファイル名だけにするか、C のようにするかですけど、表示だけである程度場所が分かりそうな情報が表示されていると便利なので、相対パスもしくはそのファイルがあるフォルダー名のどちらかにします。フォルダーは存在位置をだいたい覚えてるもんですから。
表示だけでは絶対パスがわからないのでTooltipは必要ですよね。
表示をファイル名だけにするか、C のようにするかですけど、表示だけである程度場所が分かりそうな情報が表示されていると便利なので、相対パスもしくはそのファイルがあるフォルダー名のどちらかにします。フォルダーは存在位置をだいたい覚えてるもんですから。
884デフォルトの名無しさん (ワッチョイ 5ff2-nzYM)
2021/09/08(水) 14:22:30.46ID:pb/a0YKS0 D列〜H列の各4項目を印刷エリアのA列に配置して
それぞれ印刷がしたいのですが、下記でも出力されますが、
もっと簡略な書き方あったら教えてください。
Sub PrintOut()
Range("A1").Value = Range("D1").Value
Range("A2").Value = Range("D2").Value
Range("A3").Value = Range("D3").Value
Range("A4").Value = Range("D4").Value
ActiveWindow.SelectedSheets.PrintOut
Range("A1").Value = Range("E1").Value
Range("A2").Value = Range("E2").Value
Range("A3").Value = Range("E3").Value
Range("A4").Value = Range("E4").Value
ActiveWindow.SelectedSheets.PrintOut
(以下F列分〜H列分まで繰り返している)
End Sub
それぞれ印刷がしたいのですが、下記でも出力されますが、
もっと簡略な書き方あったら教えてください。
Sub PrintOut()
Range("A1").Value = Range("D1").Value
Range("A2").Value = Range("D2").Value
Range("A3").Value = Range("D3").Value
Range("A4").Value = Range("D4").Value
ActiveWindow.SelectedSheets.PrintOut
Range("A1").Value = Range("E1").Value
Range("A2").Value = Range("E2").Value
Range("A3").Value = Range("E3").Value
Range("A4").Value = Range("E4").Value
ActiveWindow.SelectedSheets.PrintOut
(以下F列分〜H列分まで繰り返している)
End Sub
885デフォルトの名無しさん (ワッチョイ 27da-zGwr)
2021/09/08(水) 15:21:04.14ID:75/i6xmb0 >>884
offset 関数を使って I と J のループで回せば?
offset 関数を使って I と J のループで回せば?
886デフォルトの名無しさん (JP 0Hab-nTGN)
2021/09/08(水) 15:22:28.05ID:XlNVU0UMH >>884
Sub PrintOut()
Dim a
For c = 4 To 8
a = Cells(1, c).Resize(4, 1)
Range("A1:A4") = a
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
Sub PrintOut()
Dim a
For c = 4 To 8
a = Cells(1, c).Resize(4, 1)
Range("A1:A4") = a
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
887デフォルトの名無しさん (JP 0Hab-nTGN)
2021/09/08(水) 16:25:02.09ID:XlNVU0UMH 処理する範囲をわかりやすくしてみた
Sub PrintOut()
Dim a
For Each c In Range("D1:H1") 'DからHまで
a = c.Resize(4, 1) '縦4行
Range("A1").Resize(4, 1) = a
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
Sub PrintOut()
Dim a
For Each c In Range("D1:H1") 'DからHまで
a = c.Resize(4, 1) '縦4行
Range("A1").Resize(4, 1) = a
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
888デフォルトの名無しさん (スッップ Sd7f-aNuU)
2021/09/08(水) 16:25:12.58ID:W4cHTvUwd すげー!凄い短くなってる!
ありがとうございます。
後で試してみます。
まだVBA初めて間もないのですが、しっかり勉行すれば、
繰り返し作業簡素化の可能性を非常に感じました。
ありがとうございました。
ありがとうございます。
後で試してみます。
まだVBA初めて間もないのですが、しっかり勉行すれば、
繰り返し作業簡素化の可能性を非常に感じました。
ありがとうございました。
889デフォルトの名無しさん (ワッチョイ 7f8e-m4tS)
2021/09/08(水) 16:48:49.57ID:q+ZxDcv00 またいつものあいつに引っ掛かる馬鹿ども
890デフォルトの名無しさん (ブーイモ MMab-Esde)
2021/09/08(水) 17:49:01.52ID:I0eTwbNOM って言いたいだけの自尊心の擬人化さん
891デフォルトの名無しさん (アウアウウー Sa8b-AvaG)
2021/09/08(水) 18:05:21.93ID:ehctv71ga ねぇねぇワクチンが足りないとか余って捨ててるとかなんなの?
Excelでさえ1億2千万人のデータぐらい余裕で作れるんじゃないの?
Excelでさえ1億2千万人のデータぐらい余裕で作れるんじゃないの?
892デフォルトの名無しさん (ワッチョイ 5fda-qMED)
2021/09/08(水) 18:33:49.98ID:lGj0x8DT0 with派は?
893デフォルトの名無しさん (アウアウウー Sa8b-AvaG)
2021/09/08(水) 18:39:36.93ID:wkgfp7fUa Excelの印象派はちょっと困るねぇ
セル結合じゃなくてシェイプでやってよ
セル結合じゃなくてシェイプでやってよ
894デフォルトの名無しさん (ワッチョイ 5f42-3UkT)
2021/09/08(水) 19:58:14.37ID:y8J9pOw20 Excelではどうにも出来ないたぐいのヒューマンエラーが多いからな
895デフォルトの名無しさん (アウアウクー MMbb-pQFE)
2021/09/09(木) 09:38:25.14ID:foh10V2pM たとえば5000行もある住所録(一人一行使う)で、左端(つまりA列)にチェックボックスをつけるって出来ます?
5000個もチェックボックスオブジェクトを作るって現実にやってる方います?これは現実的でしょうか?
今考えてるのはA列に正方形(□)とレ点付きの□の二択プルダウンを用意することなんだけど、
それだとマウスのダブルクリックで表示を切り替えることは出来なくなる。
良い方法ありますか?
5000個もチェックボックスオブジェクトを作るって現実にやってる方います?これは現実的でしょうか?
今考えてるのはA列に正方形(□)とレ点付きの□の二択プルダウンを用意することなんだけど、
それだとマウスのダブルクリックで表示を切り替えることは出来なくなる。
良い方法ありますか?
896デフォルトの名無しさん (JP 0Hab-nTGN)
2021/09/09(木) 09:59:04.73ID:4tB32NIbH >>895
チェックボックスを5000個作るぐらい簡単だが?
けど、そういう一覧表を作る意味がないだろ
5000件も手作業でチェックなんか入れてたら絶対にミスが起きるし
次の作業のことまで考えて表を作れよ
チェックボックスを5000個作るぐらい簡単だが?
けど、そういう一覧表を作る意味がないだろ
5000件も手作業でチェックなんか入れてたら絶対にミスが起きるし
次の作業のことまで考えて表を作れよ
897デフォルトの名無しさん (ブーイモ MMcf-6D6a)
2021/09/09(木) 10:11:27.57ID:zJmTPnJXM >>895
チェックボックスみたいなテキストでやる
チェックボックスみたいなテキストでやる
898デフォルトの名無しさん (スップ Sd7f-nTGN)
2021/09/09(木) 10:12:10.09ID:FIynLA9Dd899デフォルトの名無しさん (スフッ Sd7f-nTGN)
2021/09/09(木) 10:25:59.17ID:4jr1qQtOd 参考 チェックボックスの絵文字 使用は推奨しない
☑
✅
☑
✅
900デフォルトの名無しさん (ブーイモ MMcf-Esde)
2021/09/09(木) 10:27:08.70ID:2Kg/wmz7M >>895
ダブルクリックかライトクリックイベントで背景色変えるとかなんか印を付けるとかした方が楽そう
ダブルクリックかライトクリックイベントで背景色変えるとかなんか印を付けるとかした方が楽そう
901デフォルトの名無しさん (ワッチョイ e749-fMWa)
2021/09/09(木) 10:32:22.27ID:IpCo+OYQ0 >>895
普通にその方法でいいじゃんと思うけど、ダブルクリック必須なの?
チェックボックスの操作ならせめてシングルクリックだと思うけど。
マウス必須ならA列にハイパーリンクを仕込んでおいて、イベント
ハンドラの中でどこが押されたかを判断して状態を反転させるという
方法もある。
ただこの場合A列は自由に入力可能なのでシートの保護を掛けることに
なると思うし、どの部分をどこまで編集可能とするかということとの
兼ね合いになると思う。
普通にその方法でいいじゃんと思うけど、ダブルクリック必須なの?
チェックボックスの操作ならせめてシングルクリックだと思うけど。
マウス必須ならA列にハイパーリンクを仕込んでおいて、イベント
ハンドラの中でどこが押されたかを判断して状態を反転させるという
方法もある。
ただこの場合A列は自由に入力可能なのでシートの保護を掛けることに
なると思うし、どの部分をどこまで編集可能とするかということとの
兼ね合いになると思う。
902デフォルトの名無しさん (ワッチョイ 27da-zGwr)
2021/09/09(木) 10:42:39.73ID:9k5sY4oP0 >>895
あなたの言ってることはダブルクリックとかチェックボックスとプルダウンとか意味不明なんだけど、やりたいことさえはっきりしてなら VBA でオブジェクトの追加コマンドを追加場所を1行から5000行まで変えながら回せばいい。
あなたの言ってることはダブルクリックとかチェックボックスとプルダウンとか意味不明なんだけど、やりたいことさえはっきりしてなら VBA でオブジェクトの追加コマンドを追加場所を1行から5000行まで変えながら回せばいい。
903デフォルトの名無しさん (JP 0Hab-nTGN)
2021/09/09(木) 10:48:23.02ID:4tB32NIbH904デフォルトの名無しさん (アウアウクー MMbb-pQFE)
2021/09/09(木) 10:50:53.75ID:foh10V2pM シングルクリックと間違えてました。
自動的に5000個作ると30分待っても終わらないので、ダメなのだと思ってました
自動的に5000個作ると30分待っても終わらないので、ダメなのだと思ってました
905デフォルトの名無しさん (アウアウクー MMbb-pQFE)
2021/09/09(木) 10:53:21.37ID:foh10V2pM906デフォルトの名無しさん (JP 0Hab-nTGN)
2021/09/09(木) 11:01:26.77ID:4tB32NIbH 試しにやってみたけど、チェックボックス5000個コピペだけなら20秒ぐらいで終わったぞ
https://i.imgur.com/4Bo9Yvp.png
https://i.imgur.com/4Bo9Yvp.png
907デフォルトの名無しさん (アウアウクー MMbb-pQFE)
2021/09/09(木) 11:03:58.28ID:foh10V2pM908デフォルトの名無しさん (アウアウクー MMbb-pQFE)
2021/09/09(木) 11:07:12.46ID:foh10V2pM909デフォルトの名無しさん (ワッチョイ 7fda-nTGN)
2021/09/09(木) 11:21:19.40ID:37zPgm1s0 >>907
ちなみにどんなふうに削除してる?
ちなみにどんなふうに削除してる?
910デフォルトの名無しさん (アウアウウー Sa8b-bFZP)
2021/09/09(木) 14:10:09.39ID:m7/bNtYYa クラスモジュールの引数に可変長引数を渡したくて、呼び出し側でその引数に変数をぶち込んで渡したいんだけど、これってやっぱりできないの?
911デフォルトの名無しさん (ワッチョイ bf68-vUzR)
2021/09/09(木) 19:38:24.58ID:7gPjCFSp0 >>895
sheetモジュールに記述
※ただ、選択済みのセルをクリックしてon/offができない
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
d = WorksheetFunction.Unicode(Cells(1, 1).Value)
Debug.Print (d) ' 38960
If Target.Column = 1 Then
Target.NumberFormatLocal = WorksheetFunction.Unichar(10004) & ";□;0;@"
If Target.Value = 0 Then Target.Value = -1
Target.Value = Target.Value * -1
End If
End Sub
sheetモジュールに記述
※ただ、選択済みのセルをクリックしてon/offができない
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
d = WorksheetFunction.Unicode(Cells(1, 1).Value)
Debug.Print (d) ' 38960
If Target.Column = 1 Then
Target.NumberFormatLocal = WorksheetFunction.Unichar(10004) & ";□;0;@"
If Target.Value = 0 Then Target.Value = -1
Target.Value = Target.Value * -1
End If
End Sub
912デフォルトの名無しさん (ワッチョイ bf68-vUzR)
2021/09/09(木) 19:39:38.73ID:7gPjCFSp0 デバッグ残ってたわ。こっちで
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'A列のみ
If Target.Column = 1 Then
'書式設定を設定
Target.NumberFormatLocal = WorksheetFunction.Unichar(10004) & ";□;0;@"
'-1かけて反転させる
If Target.Value = 0 Then Target.Value = -1
Target.Value = Target.Value * -1
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'A列のみ
If Target.Column = 1 Then
'書式設定を設定
Target.NumberFormatLocal = WorksheetFunction.Unichar(10004) & ";□;0;@"
'-1かけて反転させる
If Target.Value = 0 Then Target.Value = -1
Target.Value = Target.Value * -1
End If
End Sub
913デフォルトの名無しさん (ワッチョイ c77c-oynR)
2021/09/09(木) 19:55:23.82ID:zfiF925t0914デフォルトの名無しさん (ブーイモ MMcf-6D6a)
2021/09/09(木) 23:48:42.23ID:ULMewu8MM916デフォルトの名無しさん (ワッチョイ 3a2f-aIS6)
2021/09/10(金) 00:57:16.66ID:cGWG4Dd90917デフォルトの名無しさん (ワッチョイ b501-BHRH)
2021/09/10(金) 01:37:01.01ID:k/ICsAd30918デフォルトの名無しさん (スプッッ Sd12-dGLa)
2021/09/10(金) 06:29:18.76ID:SjJWgB1Wd エスパーしてみるとオーバーロードしたいってこと?
919デフォルトの名無しさん (ワッチョイ 5e68-gxqX)
2021/09/10(金) 07:09:26.44ID:LHgBQKs+0 >>910てParamArrayでいいじゃん(いいじゃん)
920910 (アウアウウー Sa21-zdR4)
2021/09/10(金) 12:04:43.32ID:9zsJDEjAa 言葉足らずで申し訳ない
・クラスモジュールでtestSubを作る
・testSubには引数として複数の文字列(パス)を入れたいが、場合によってはいれる数が変わるので可変長引数として渡したい→paramArrayを使った
・標準モジュールでtestSubを呼び出すときに引数に文字列直打ちで入力→これは呼び出せた
例 class.testSub(“a”, “b”, ”c”) →OK
・一方で引数に参照渡し?で変数を入れることができなかった
例
Dim a as string:a = “a”
Dim b as string:a = “b”
Dim c as string:a = “c”
class.testSub(a, b, c) →エラー
まとめ:参照渡し+可変長引数を実現する方法はありますか?という質問です
・クラスモジュールでtestSubを作る
・testSubには引数として複数の文字列(パス)を入れたいが、場合によってはいれる数が変わるので可変長引数として渡したい→paramArrayを使った
・標準モジュールでtestSubを呼び出すときに引数に文字列直打ちで入力→これは呼び出せた
例 class.testSub(“a”, “b”, ”c”) →OK
・一方で引数に参照渡し?で変数を入れることができなかった
例
Dim a as string:a = “a”
Dim b as string:a = “b”
Dim c as string:a = “c”
class.testSub(a, b, c) →エラー
まとめ:参照渡し+可変長引数を実現する方法はありますか?という質問です
921デフォルトの名無しさん (ラクッペペ MM3e-oWuh)
2021/09/10(金) 12:33:58.83ID:LPBZaVhNM へー、どんなエラーメッセージが出るんだい?
922デフォルトの名無しさん (スップ Sdea-5vIl)
2021/09/10(金) 12:41:02.44ID:s5UDpNf0d bとcに代入されてないように見えるんだけど…
923910 (アウアウウー Sa21-zdR4)
2021/09/10(金) 12:44:45.11ID:9zsJDEjAa >>922
誤字りました
>例
>Dim a as string:a = “a”
>Dim b as string:b = “b”
>Dim c as string:c = “c”
>
>class.testSub(a, b, c) →エラー
誤字りました
>例
>Dim a as string:a = “a”
>Dim b as string:b = “b”
>Dim c as string:c = “c”
>
>class.testSub(a, b, c) →エラー
924デフォルトの名無しさん (スッップ Sd0a-agYY)
2021/09/10(金) 12:44:47.75ID:Wgizc1rOd paramarrayは使ったことないからなんでエラーになるか知らないけど
optional byrefをいっぱい作れば解決か?
optional byrefをいっぱい作れば解決か?
925デフォルトの名無しさん (ワッチョイ 5949-MUqd)
2021/09/10(金) 12:57:26.48ID:3anmc9lr0 うちではエラーにならないので、ParamArray以外のところで何か起きていると思う
926デフォルトの名無しさん (ワッチョイ 3a2f-aIS6)
2021/09/10(金) 13:42:46.46ID:cGWG4Dd90 とりあえずエラーメッセージぐらい書け
Call class.testSub(a, b, c) とかいうオチじゃないだろうな
Call class.testSub(a, b, c) とかいうオチじゃないだろうな
927デフォルトの名無しさん (ワッチョイ 3a2f-aIS6)
2021/09/10(金) 13:48:25.18ID:cGWG4Dd90 あと言っとくけど、参照型と参照渡しはちがうからな
その例でいくなら(受け取り側で何やりたいかによるが)参照渡しである必要性なんてないんじゃね
その例でいくなら(受け取り側で何やりたいかによるが)参照渡しである必要性なんてないんじゃね
928デフォルトの名無しさん (オッペケ Srbd-RhPI)
2021/09/10(金) 15:05:47.68ID:bX+CqFZ4r vbaの配列って絶対要素数がわかってないとだめなの?
他の言語のリストみたいにあとから追加とか削除したいんだけど
他の言語のリストみたいにあとから追加とか削除したいんだけど
929デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/10(金) 15:09:49.67ID:kF1ZwEU6a930デフォルトの名無しさん (ワッチョイ a95f-73Hx)
2021/09/10(金) 15:16:50.98ID:tlapevkG0 二次元配列以外はコレクションでいいよな
931デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/10(金) 15:22:02.18ID:kF1ZwEU6a Dictionaryも好きだけどね
用途によるね
用途によるね
932デフォルトの名無しさん (オッペケ Srbd-RhPI)
2021/09/10(金) 15:47:18.98ID:bX+CqFZ4r933デフォルトの名無しさん (オッペケ Srbd-RhPI)
2021/09/10(金) 16:10:25.64ID:bX+CqFZ4r 配列が可変だったら終わる作業が全く終わらん
マジでいらつくわ
マジでいらつくわ
934デフォルトの名無しさん (ワッチョイ eaf2-GwBl)
2021/09/10(金) 16:26:30.74ID:rHUFiRNt0 >>886>>887
コンパイルエラー
変数が定義されていません
とか出たのですが・・・。
c のトコがハイライトされています。
コンパイルエラー
変数が定義されていません
とか出たのですが・・・。
c のトコがハイライトされています。
935デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/10(金) 16:31:21.74ID:8Iwa8KgHa >>934
変数が定義されてないなら定義すればいい
変数が定義されてないなら定義すればいい
936デフォルトの名無しさん (ワッチョイ a668-dGLa)
2021/09/10(金) 16:31:29.22ID:2Fxd4w670 Set range = ActiveSheet.Range("J10")
debug.print range.Cells(0, 0).address
この出力がI9になります
J10を期待したのですがどういう事ですか?
debug.print range.Cells(0, 0).address
この出力がI9になります
J10を期待したのですがどういう事ですか?
937デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/10(金) 16:36:53.08ID:8Iwa8KgHa >>936
ActiveSheet.Cells(1,1).AddressはA1になるでしょ?
んで、ActiveSheet.Cells(0,0).Addressはオブジェクト定義エラーになるでしょ
つまり、ワークシートの起点はA1であり、Cells(1,1)なわけ
だから、それから今回の事象は推察できるでしょ
余談だけどその変数名は絶対にやめた方がいい
VBAには既にRangeって単語があるんだから
ActiveSheet.Cells(1,1).AddressはA1になるでしょ?
んで、ActiveSheet.Cells(0,0).Addressはオブジェクト定義エラーになるでしょ
つまり、ワークシートの起点はA1であり、Cells(1,1)なわけ
だから、それから今回の事象は推察できるでしょ
余談だけどその変数名は絶対にやめた方がいい
VBAには既にRangeって単語があるんだから
938デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/10(金) 16:41:57.41ID:8Iwa8KgHa939デフォルトの名無しさん (ワッチョイ a95f-73Hx)
2021/09/10(金) 16:42:03.28ID:tlapevkG0940デフォルトの名無しさん (ワッチョイ a668-dGLa)
2021/09/10(金) 16:52:02.92ID:2Fxd4w670941デフォルトの名無しさん (ワッチョイ a95f-73Hx)
2021/09/10(金) 16:54:59.11ID:tlapevkG0 0から始まる配列なんかを入れたいという感じか
942デフォルトの名無しさん (ワッチョイ 3a2f-aIS6)
2021/09/10(金) 17:05:41.13ID:cGWG4Dd90943デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/10(金) 17:13:14.83ID:8Iwa8KgHa >>942
cの宣言してないだけ
cの宣言してないだけ
944デフォルトの名無しさん (ワッチョイ b501-BHRH)
2021/09/10(金) 17:47:04.78ID:k/ICsAd30 >>920
下に書いたようにParamArrayを使ったメソッドが定義されたクラスモジュールを作って、
それに宣言した変数を渡してみたけどエラーは起きないよ。
後、「参照渡し」で有る事を気にしてるけど、ParamArrayが指定された引数は参照渡しになる。
例えばtestSub内でargs(0)に適当な値を割り当てると、呼び出し元のcaller関数のaの値も変わる。
クラスモジュール(class.cls)
Public Sub testSub(ParamArray args())
Dim arg
For Each arg In args
If VarType(arg) = vbString Then Debug.Print arg;
Next
End Sub
標準モジュール
Sub caller()
Dim a As String: a = "a"
Dim b As String: b = "b"
Dim c As String: c = "c"
Dim Class As New Class
Class.testSub a, b, c
'イミディエイトウインドウ: abc
End Sub
だからこっちが質問内容を取り違えてるんだと思うんだけど、どこが違う?
それとエラーメッセージを教えて欲しい
もし意味が分かるならコンパイルエラーか実行時エラーかも知りたい
下に書いたようにParamArrayを使ったメソッドが定義されたクラスモジュールを作って、
それに宣言した変数を渡してみたけどエラーは起きないよ。
後、「参照渡し」で有る事を気にしてるけど、ParamArrayが指定された引数は参照渡しになる。
例えばtestSub内でargs(0)に適当な値を割り当てると、呼び出し元のcaller関数のaの値も変わる。
クラスモジュール(class.cls)
Public Sub testSub(ParamArray args())
Dim arg
For Each arg In args
If VarType(arg) = vbString Then Debug.Print arg;
Next
End Sub
標準モジュール
Sub caller()
Dim a As String: a = "a"
Dim b As String: b = "b"
Dim c As String: c = "c"
Dim Class As New Class
Class.testSub a, b, c
'イミディエイトウインドウ: abc
End Sub
だからこっちが質問内容を取り違えてるんだと思うんだけど、どこが違う?
それとエラーメッセージを教えて欲しい
もし意味が分かるならコンパイルエラーか実行時エラーかも知りたい
945デフォルトの名無しさん (ワッチョイ b501-BHRH)
2021/09/10(金) 18:37:19.42ID:k/ICsAd30 >>934
Columnsで列ごとに取り出す方法で短く、分かりやすくしてみた
Sub PrintOut()
Dim Column As Range
For Each Column In Range("D1:H4").Columns '指定範囲を一列ごと取り出す
Range("A1:A4").Value = Column.Value '取り出した一列の値をA1:A4に張り付ける
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
ちなみにこういうのはActive***とセル番号指定じゃなくて、
シートモジュールとテーブル使った方がメンテしやすくなる。
A1:A4とD1:H4にそれぞれテーブルを作成(セルを選択して「ホーム」リボンの「テーブルとして書式設定」)し、
A1:A4のテーブル名を「コピー先」、D1:H4のテーブル名を「コピー元一覧」にする。
そのシートのシートモジュールに次の様なメソッドを定義する
Sub MyPrintOut()
Dim Column As ListColumn
For Each Column In ListObjects("コピー元一覧").ListColumns
ListObjects("コピー先").Value = Column.DataBodyRange.Value
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
やってることは一緒だけど、
・コピペする(される)セルの番地が変わっても動く
・D1:H4の範囲が増えてもテーブルを範囲を変更するだけで動く
・「コピー元一覧」から「コピー先」に張り付けてるのがソースを見ただけで分かる
とメリットだらけ
Columnsで列ごとに取り出す方法で短く、分かりやすくしてみた
Sub PrintOut()
Dim Column As Range
For Each Column In Range("D1:H4").Columns '指定範囲を一列ごと取り出す
Range("A1:A4").Value = Column.Value '取り出した一列の値をA1:A4に張り付ける
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
ちなみにこういうのはActive***とセル番号指定じゃなくて、
シートモジュールとテーブル使った方がメンテしやすくなる。
A1:A4とD1:H4にそれぞれテーブルを作成(セルを選択して「ホーム」リボンの「テーブルとして書式設定」)し、
A1:A4のテーブル名を「コピー先」、D1:H4のテーブル名を「コピー元一覧」にする。
そのシートのシートモジュールに次の様なメソッドを定義する
Sub MyPrintOut()
Dim Column As ListColumn
For Each Column In ListObjects("コピー元一覧").ListColumns
ListObjects("コピー先").Value = Column.DataBodyRange.Value
ActiveWindow.SelectedSheets.PrintOut
Next
End Sub
やってることは一緒だけど、
・コピペする(される)セルの番地が変わっても動く
・D1:H4の範囲が増えてもテーブルを範囲を変更するだけで動く
・「コピー元一覧」から「コピー先」に張り付けてるのがソースを見ただけで分かる
とメリットだらけ
946デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/10(金) 21:16:37.69ID:cbJJzriEM947デフォルトの名無しさん (ワッチョイ a668-dGLa)
2021/09/10(金) 21:38:37.34ID:2Fxd4w670 >>946
そういう問題じゃないんですよ
そういう問題じゃないんですよ
948デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/10(金) 21:40:05.19ID:TT1mfVcaM >>947
だからどういう問題かを書けないなら黙ってなよ
だからどういう問題かを書けないなら黙ってなよ
949デフォルトの名無しさん (ワッチョイ a668-dGLa)
2021/09/10(金) 21:43:02.76ID:2Fxd4w670 >>948
動くかどうかという話ではないので論点はそこではありません
動くかどうかという話ではないので論点はそこではありません
950デフォルトの名無しさん (ワッチョイ a6da-dGLa)
2021/09/10(金) 22:07:47.67ID:rk4qX9ha0 動かすだけならグローバルに配列つくればいいわな
951デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/10(金) 22:16:10.75ID:cbJJzriEM952デフォルトの名無しさん (ワッチョイ a95f-DZpR)
2021/09/10(金) 22:19:16.50ID:rrgK5Yqx0953デフォルトの名無しさん (ワッチョイ 66b0-FDYl)
2021/09/10(金) 22:20:43.81ID:oDrMz70O0 難癖つけててワロタ
954デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/10(金) 22:37:14.80ID:sbKq7iyBM >>952
> Rangeって書かれても、どんな目的で何のRangeを変数に入れたのかが分かるように書くのが綺麗なコード
例えば指定された範囲にいくつかの装飾を適用する
Private Sub 装飾(Range As Range)
With Range
...
End With
End Sub
君なら引数の名前をどうする?
> Rangeって書かれても、どんな目的で何のRangeを変数に入れたのかが分かるように書くのが綺麗なコード
例えば指定された範囲にいくつかの装飾を適用する
Private Sub 装飾(Range As Range)
With Range
...
End With
End Sub
君なら引数の名前をどうする?
955デフォルトの名無しさん (ワッチョイ a95f-DZpR)
2021/09/10(金) 22:56:49.10ID:rrgK5Yqx0 Excelの装飾ってのがよくわからんけど、書式のこと?
関数っぽい書き方してるからこんなんでいいんじゃないの
Private Sub SetFormat_to_TargetRange(ByVal TargetRange As Range)
With TargetRange
...
End With
End Sub
関数っぽい書き方してるからこんなんでいいんじゃないの
Private Sub SetFormat_to_TargetRange(ByVal TargetRange As Range)
With TargetRange
...
End With
End Sub
956デフォルトの名無しさん (ワッチョイ b501-BHRH)
2021/09/10(金) 23:04:12.45ID:k/ICsAd30 文脈的に明らかならRange As Rangeいいと思うけどね。
あと、「Rangeオブジェクト」である以上の情報がない変数や引数に対して無理やり名づけようとしても、
結局TargetRange的な抽象的な名前になっちゃう事もある。
あと、「Rangeオブジェクト」である以上の情報がない変数や引数に対して無理やり名づけようとしても、
結局TargetRange的な抽象的な名前になっちゃう事もある。
957デフォルトの名無しさん (ワッチョイ b501-BHRH)
2021/09/10(金) 23:06:14.39ID:k/ICsAd30 >>955
流石にそれは冗長すぎて逆に読みにくいだろ・・・
流石にそれは冗長すぎて逆に読みにくいだろ・・・
958デフォルトの名無しさん (ワッチョイ 5e68-gxqX)
2021/09/10(金) 23:11:20.56ID:LHgBQKs+0 >>954
そこはtarget as rangeでいいと思う
一番読みやすい
自分しか使わない場合でもrange as rangeは使わないかな
vbaの場合、引数なしの関数と変数って見分けが付きにくい
ってかなんだこれエラーになるぞ
Sub foo()
Dim Calculate As Long
Calculate
End Sub
これはエラーにならない
Sub foo()
Dim Calculate As Long
End Sub
これもエラーにならない
Sub foo()
Calculate
End Sub
変数名と関数名がかぶると変数が優先される?
まぁ何にしろ、こんな事は避けたいから俺はかぶらないようにするけどね
そこはtarget as rangeでいいと思う
一番読みやすい
自分しか使わない場合でもrange as rangeは使わないかな
vbaの場合、引数なしの関数と変数って見分けが付きにくい
ってかなんだこれエラーになるぞ
Sub foo()
Dim Calculate As Long
Calculate
End Sub
これはエラーにならない
Sub foo()
Dim Calculate As Long
End Sub
これもエラーにならない
Sub foo()
Calculate
End Sub
変数名と関数名がかぶると変数が優先される?
まぁ何にしろ、こんな事は避けたいから俺はかぶらないようにするけどね
959デフォルトの名無しさん (ワッチョイ a95f-DZpR)
2021/09/10(金) 23:15:36.34ID:rrgK5Yqx0 多少長くても要素要素は省いちゃメンテが大変になるから多少冗長でも構わないスタンスで
単語の簡素化はしてもいいなら関数名をSetFmt_TgtRngとかにするかもね
あとそもそも、挙げられた例は不適切では?
今回話題になってるのは呼び出し先の(汎用的に使える)関数での変数名ではなくて、呼び出し元での変数名かと
単語の簡素化はしてもいいなら関数名をSetFmt_TgtRngとかにするかもね
あとそもそも、挙げられた例は不適切では?
今回話題になってるのは呼び出し先の(汎用的に使える)関数での変数名ではなくて、呼び出し元での変数名かと
960デフォルトの名無しさん (ワッチョイ b501-BHRH)
2021/09/10(金) 23:25:05.99ID:k/ICsAd30 >>958
再定義(シャドーイング)されてるだけ。
親スコープから継承されてる宣言名(今回で言えばオブジェクト名.Calculate)を再定義すると、定義が上書きされる。
Calculateは整数として再定義されたので、そのスコープではCalculateだけなら暗黙的に整数になる。
明示的に「オブジェクト名.Calculate」とすればメソッドとしてのCalculateを使用できる
再定義(シャドーイング)されてるだけ。
親スコープから継承されてる宣言名(今回で言えばオブジェクト名.Calculate)を再定義すると、定義が上書きされる。
Calculateは整数として再定義されたので、そのスコープではCalculateだけなら暗黙的に整数になる。
明示的に「オブジェクト名.Calculate」とすればメソッドとしてのCalculateを使用できる
961デフォルトの名無しさん (ワッチョイ 11da-dGLa)
2021/09/11(土) 00:00:09.96ID:qqZDVqkP0 personal.xlsbを複数の端末で共有したいので共有フォルダーにおいています.
XLSTARTのpersonal.xlsbは削除して共有フォルダーのpersonal.xlsbへのショートカットをおいています.
エクセルが起動するときにpersonal.xlsbを開くかどうか毎回聞いてきます
(セキュリティのマクロの設定は「警告を表示して全てのマクロを無効にする」です)
毎回開くを押すのが面倒なので共有フォルダーのpersonal.xlsbだけ常時開くような設定はできないでしょうか?
XLSTARTのpersonal.xlsbは削除して共有フォルダーのpersonal.xlsbへのショートカットをおいています.
エクセルが起動するときにpersonal.xlsbを開くかどうか毎回聞いてきます
(セキュリティのマクロの設定は「警告を表示して全てのマクロを無効にする」です)
毎回開くを押すのが面倒なので共有フォルダーのpersonal.xlsbだけ常時開くような設定はできないでしょうか?
962デフォルトの名無しさん (ワッチョイ 5e68-gxqX)
2021/09/11(土) 07:08:07.40ID:M0KgNEQw0963デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/11(土) 08:32:29.27ID:uUbGGWZvM >>962
スコープを持った言語ではたいてい内側のスコープが優先されるよ
中にはあえてエラーにする言語もあるけど
https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0136
スコープを持った言語ではたいてい内側のスコープが優先されるよ
中にはあえてエラーにする言語もあるけど
https://docs.microsoft.com/ja-jp/dotnet/csharp/misc/cs0136
964デフォルトの名無しさん (ササクッテロレ Spbd-Eqy2)
2021/09/11(土) 09:37:25.87ID:3jGknNChp >>955
関数の大きさにもよるな
小さくてすぐ上に引数設定して
型が見えてるようなのはvalueでいいと思う
少しごちゃごちゃして見辛いのは
targetRangeでいいと思うし
更にもう少し大きくなって業務的な
意味を持つようになったらその名前付ければ
いいんじゃないかな
関数の大きさにもよるな
小さくてすぐ上に引数設定して
型が見えてるようなのはvalueでいいと思う
少しごちゃごちゃして見辛いのは
targetRangeでいいと思うし
更にもう少し大きくなって業務的な
意味を持つようになったらその名前付ければ
いいんじゃないかな
965デフォルトの名無しさん (ワッチョイ a668-dGLa)
2021/09/11(土) 10:18:08.93ID:JYcIgh+V0966デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/11(土) 10:49:48.68ID:eXg+YAmHM >>964
Valueはないわ…
Valueはないわ…
967デフォルトの名無しさん (ワッチョイ 11da-k7k8)
2021/09/11(土) 12:17:24.93ID:qqZDVqkP0 >>966
そうだよな。value指定ではフォーマット変更は無理だよな
そうだよな。value指定ではフォーマット変更は無理だよな
968デフォルトの名無しさん (アウアウウー Sa21-DZpR)
2021/09/11(土) 13:14:28.26ID:GnKWsobMa Valueだけはねぇわ
targetとtmpとi・j・kとrくらいしか意味の薄い変数は使わないようにしないと
targetとtmpとi・j・kとrくらいしか意味の薄い変数は使わないようにしないと
969デフォルトの名無しさん (ブーイモ MM8e-FDYl)
2021/09/11(土) 13:57:33.58ID:SrjYrNmNM m,nも
970デフォルトの名無しさん (ワッチョイ 5e68-gxqX)
2021/09/11(土) 14:37:20.09ID:M0KgNEQw0 i・j・k
顔文字かと思った
顔文字かと思った
971デフォルトの名無しさん (ササクッテロロ Spbd-Eqy2)
2021/09/12(日) 11:12:03.90ID:up1UF/mUp valueがダメだと言ってる奴は恐らくプロパティとか
プロパティの使えない他言語とか使ったことのない井の中の蛙という奴だな
VBAしかやってないジジイにはよくあること
プロパティの使えない他言語とか使ったことのない井の中の蛙という奴だな
VBAしかやってないジジイにはよくあること
972デフォルトの名無しさん (ワッチョイ 5e68-gxqX)
2021/09/12(日) 11:42:37.67ID:igJhGb/40 >>971
君、韓国人?
君、韓国人?
973デフォルトの名無しさん (ワッチョイ 11da-k7k8)
2021/09/12(日) 11:48:24.82ID:3Dv8YdNb0 韓国をばかにするな!ITに関しては日本より進んでいるぞ
974デフォルトの名無しさん (ワッチョイ a6da-dGLa)
2021/09/12(日) 12:10:04.57ID:tsfiI8be0 どこ見て言ってんだか
975デフォルトの名無しさん (ワッチョイ 11da-k7k8)
2021/09/12(日) 12:15:32.69ID:3Dv8YdNb0 ここ見ててんだよ
976デフォルトの名無しさん (テテンテンテン MM3e-h3Yj)
2021/09/12(日) 12:55:49.25ID:xXC+mfefM977デフォルトの名無しさん (ワッチョイ a95f-DZpR)
2021/09/12(日) 13:36:49.25ID:5xdi3uAF0 オブジェクト型のRange型なのに、Valueを変数名にするのはVBAの常識的にNGなのは自明
978デフォルトの名無しさん (ワッチョイ 11da-k7k8)
2021/09/12(日) 14:09:17.30ID:3Dv8YdNb0979デフォルトの名無しさん (ワッチョイ 3a2f-Le98)
2021/09/12(日) 16:11:41.17ID:INS7ikYU0980デフォルトの名無しさん (ワッチョイ a668-dGLa)
2021/09/12(日) 16:21:24.92ID:aVK/EU7g0 元の元は>>936(私)でdim range as rangeに対してsetしたのですが
引数としてrange as rangeとされている状態でsetする事なんてあるのですか?
普通は無いなら途中から引数の話になるのもずれてません?
引数としてrange as rangeとされている状態でsetする事なんてあるのですか?
普通は無いなら途中から引数の話になるのもずれてません?
981デフォルトの名無しさん (ワッチョイ ea4f-Eqy2)
2021/09/12(日) 16:31:54.19ID:pHewVqE+0 そう言えばデコレーターパターンとかでは
valueはよく見るけどreferって見ないよね
なんでだろ?
valueはよく見るけどreferって見ないよね
なんでだろ?
レス数が950を超えています。1000を超えると書き込みができなくなります。
