Excel VBA 質問スレ Part59

■ このスレッドは過去ログ倉庫に格納されています
2019/02/09(土) 15:12:30.70ID:3lTArmdf0
!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
191デフォルトの名無しさん (ブーイモ MM6b-KyI1)
垢版 |
2019/02/16(土) 05:24:29.40ID:evls1zM4M
>>190
ワラ
2019/02/16(土) 05:32:17.75ID:Q7QEPoKZM
素人が素人に頼むとなそうなるわな
(笑)
2019/02/16(土) 07:48:58.08ID:GEWA9gU60
方向が変わったのは>>148がきっかけだよね
2019/02/16(土) 07:53:50.02ID:q1DAaOKG0
>>188-189
そこは最初から違和感あったわ
> VBAで、半角カナ文字列を与えると
って書いてて
> ァィゥェォャュョッ
って全角で書いてるからネタだと思って放置してたけどァィゥェォッュョみたいな文字ってスマホだと入力できないのな
(いや、できるかも知れんが俺にはわからんかったのでこれはコピペで入力した)
まあそれならそうと書いて欲しい

この手の変換はそれなりに需要があるみたいで
カタカナ 小さい文字 変換 vba
とかでググるとそれなりにヒットする
とりあえずは
https://www.relief.jp/docs/002223.html
とかを参考にすればいいと思う
2019/02/16(土) 10:00:10.02ID:uFHexw8O0
スマホで半角カナ小文字の入力は、俺のXperiaの場合だと「la」と入力すると全角小文字の「ぁ」になって、変換を押すと候補に半角「ァ」が出てくる
2019/02/16(土) 10:07:20.68ID:uFHexw8O0
フリック入力ならキーパッドの「ま」の下の「小」をタップすると小文字になって、候補に半角も自動的に出てくる
2019/02/16(土) 13:35:38.12ID:V3lev6Wl0
>>175
1) Range("A1:A4") = WorksheetFunction.Transpose(Split("名前、住所、性別、郵便番号", "、"))

2) Range("A1:A4") = WorksheetFunction.Transpose(Array("名前", "住所", "性別", "郵便番号"))

3) Range("A1:A4") = [{"名前";"住所";"性別";"郵便番号"}]
2019/02/16(土) 14:00:48.72ID:i29F+S9hM
VBAの2次元配列って1次元配列として使えないのね。不便。
199デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/16(土) 14:26:02.22ID:Y5C6RkaG0
二次元配列は何が入ってるか分かりにくいしネストも増えやすいから構造体かクラスを使う
2019/02/16(土) 14:36:39.42ID:eWrDkcRxM
>>198
割り切ってジャグ配列をメインに使えばいい
Rangeはしょうがないけど
2019/02/16(土) 15:38:49.30ID:XgEm9HUa0
>>199
XLシートが二次元の表なんだから難しくないだろ。
三次元なら立体を思い浮かべればいい。四次元になると時間をイメージかな。そこまでやったことないからわからん。
三次元までのネストの深さは気にならないな… ifとかで増えるにしても。増えすぎるなら内部を切り出すかな。
まあ、仕様によってどう作るかはいろいろだけど。
2019/02/16(土) 16:03:55.03ID:kXl7LE8Fx
n次元 = n階層の木構造とイメージするのが単純で良いと思うが
203デフォルトの名無しさん (JP 0H4f-mnSR)
垢版 |
2019/02/16(土) 16:14:59.54ID:3bJEG0FOH
>>201
難しくないのにわからんって馬鹿?
2019/02/16(土) 16:41:41.01ID:eWrDkcRxM
n次元より配列の配列の...の方が再帰的に扱いやすい
2019/02/16(土) 17:53:27.66ID:q1DAaOKG0
>>203
日本語不自由?
難しくないのは二次元
わからんのは四次元
206デフォルトの名無しさん (ワッチョイ c701-OvAq)
垢版 |
2019/02/16(土) 22:42:47.76ID:0In5hf0F0
モジュールで
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の配列を呼び出したいんですがどこが間違っていますか?
2019/02/16(土) 23:01:11.68ID:V3lev6Wl0
>>206

arr = arra
End Function
2019/02/16(土) 23:03:14.34ID:CD9VXZwW0
エラーメッセージ何よ。
209デフォルトの名無しさん (ワッチョイ c701-OvAq)
垢版 |
2019/02/16(土) 23:06:17.40ID:0In5hf0F0
>>208
インデックスが有効範囲にありません
2019/02/16(土) 23:10:54.03ID:CD9VXZwW0
>>209
ああ、よくある、結局原因がよくわからないやつね。
試したら、>>207が正解だったわ。

面白いな。Thisworkbookに書いてあるものを呼ぼうなんて、
考えたこともなかったから、それが原因かと思ったわ。
2019/02/16(土) 23:17:04.90ID:7Iomz0v50
そもそも配列名とプロシージャ名が同じところもおかしい
2019/02/17(日) 00:05:03.03ID:kxT8s3Mp0
馬鹿はそんなもん
間違いにくいようにコードを書くことをしない
213デフォルトの名無しさん (ワッチョイ 5f7c-We++)
垢版 |
2019/02/17(日) 09:02:57.20ID:hMcsTv+Y0
>>212
コードを書かなきゃ間違えないということか、なるほど。
それとも馬鹿は誤解を受けないような文章を書くことをしないってことか?
214デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 09:28:38.67ID:l7X7saNL0
俺が分かるからいいみたいな考えだとチームで開発はできないよ
215デフォルトの名無しさん (ワッチョイ 5f7c-We++)
垢版 |
2019/02/17(日) 10:19:09.83ID:hMcsTv+Y0
>>214
それはよく解る。保守性も悪くなるよね。
2019/02/17(日) 10:48:02.04ID:1fMGblo0M
一般的なプログラミング言語なら正しいけど、VBAだとかなり厳しくない?
下に合わせるとそれこそ可読性も保守性もクソもないゴミにしかならないよ
2019/02/17(日) 10:53:43.33ID:vi4O111wa
言語は問わず下に合わせるとゴミになる
属人性の排除といって下に合わせたがる人が少なく無いけどあれは間違いなんだ
2019/02/17(日) 11:25:11.92ID:EkiBf8gr0
VBAで下に合わせると、やたらSelect & Selection.Copyが多い、
マクロの自動記録じゃねえのこれ?
みたいなのが出来上がる。
2019/02/17(日) 11:45:18.78ID:7MWZQWrl0
ActiveHogeHoge へ参照が多いとそうなんだろうなと思うことにしている
220デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 11:45:44.34ID:l7X7saNL0
>>216
>>217
>>218
意味が伝わってないみたいだけど
cells(i, 1) = arr(i-1, 0) がセルに何が書き込まれるかはコードの前後を追わないと分からないよね
これを分かるようにするのが分かりやすいコード
プログラミングが上手か下手かは関係ない話
221デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 11:51:57.63ID:l7X7saNL0
多次元配列も Dim lngEleName As Long とか専用ループ変数を準備してるならいいけど、ijkで回してるのを見た日にはそいつを殴りにいくね。
2019/02/17(日) 11:59:45.89ID:plSLxTsM0
ひえー
なんか諸先輩方思うところ多かったようで
自分も書くとき気をつけないと
初心者ですを免罪符にしないように気をつけよう
2019/02/17(日) 12:32:03.24ID:jVC6vo8Y0
>>221
i, j, k でいいよそんなのw
2019/02/17(日) 12:47:43.60ID:1fMGblo0M
>>221
i, j, k で分かりにくくなるような長ったらしいプロシージャを書くのが悪い
225デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 13:16:45.17ID:Nxpc9YF00
>>223
上司「お前クビ」
226デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 13:31:38.58ID:Nxpc9YF00
>>224
プロシージャが簡潔ならおk
2019/02/17(日) 13:42:14.79ID:gMXfU/jdM
>>225
つまらない趣味にこだわるのは中学生までだぞ
2019/02/17(日) 13:49:15.60ID:gMXfU/jdM
偏見かもしれんがプログラミングで日常言語に近づけようとするやつは代数とか苦手だった?
って思っちゃう
229デフォルトの名無しさん (ワッチョイ ff7c-wP4P)
垢版 |
2019/02/17(日) 14:06:36.59ID:7mUUrd8D0
蛇腹erは代数が苦手(キリっ
230デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 14:20:05.25ID:Nxpc9YF00
>>227
上司「このiってなに?ちゃんと説明して」
2019/02/17(日) 14:51:51.50ID:naWxhgEk0
単なるループカウンタですけど?
見ればわかりますよね?
232デフォルトの名無しさん (ワッチョイ bfb7-uWgP)
垢版 |
2019/02/17(日) 14:57:39.75ID:k4RkjrxP0
>>221
Ing Ele ってなんの略ですか
233デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 15:13:51.30ID:Nxpc9YF00
>>232
しばくぞコラ(LongとElementだよ(にっこり))
2019/02/17(日) 15:32:11.89ID:t0Nzx7bGx
ループカウント用のプロシージャ内ローカル変数でiとかjとか使うのはありだと思う
モジュールレベル以上の参照スコープを持たせた変数をiとかjとかarrとかbufとかで宣言されてたら流石にキレるな
2019/02/17(日) 15:36:00.05ID:de8FYcuQ0
スコープが大きいほど変数名も長くして
236デフォルトの名無しさん (ワッチョイ e7b0-3a8x)
垢版 |
2019/02/17(日) 15:43:21.47ID:urjL+jec0
今時ハンガリアン使ってるのクソダサい
237デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 15:49:41.73ID:Nxpc9YF00
俺はゴールデンの方が好き
猫飼ってるから無理だけど
2019/02/17(日) 16:33:33.48ID:Rm6p2g7t0
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
とかしてもダメでした
2019/02/17(日) 16:40:07.44ID:vi4O111wa
共通の処理は共通モジュールかクラスに置いてください
シート1、シート2からはその共通の処理を呼び出してください
イベントハンドラはユーザーコードから呼び出すものではありません
240デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 16:50:40.07ID:Nxpc9YF00
>>238
Privateが付いてるプロシージャはそのモジュール内でのみ呼び出し可能
sheet1とsheet2は別モジュール
だから怒られてる
241デフォルトの名無しさん (ワッチョイ 87da-yQ/S)
垢版 |
2019/02/17(日) 16:54:09.55ID:Bys9dR540
化石みたいなレスのあるスレだな
2019/02/17(日) 17:02:42.50ID:EkiBf8gr0
>イベントハンドラはユーザーコードから呼び出すものではありません

面倒くさいとき、普通に呼び出してたわ。
2019/02/17(日) 17:18:01.63ID:Rm6p2g7t0
>>240
Public にしてもはずしてもダメです
2019/02/17(日) 17:22:34.48ID:kxT8s3Mp0
馬鹿はClassを知らない
2019/02/17(日) 17:57:40.00ID:EkiBf8gr0
>>243
>>206みたいにしても?
246デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 18:15:37.59ID:l7X7saNL0
>>243
そもそもボタンってデフォで標準プロシージャに追加されなかったっけ?
標準モジュール作って、Sub ButtonClear_Click() をまるごと移動させたらいけんじゃね?
247デフォルトの名無しさん (ワッチョイ 5f7c-We++)
垢版 |
2019/02/17(日) 18:27:30.13ID:hMcsTv+Y0
>>244
そんくらい知ってるよ、夏の日の1993だろ。
昭和生まれをナメるなよ。
2019/02/17(日) 18:37:55.36ID:Rm6p2g7t0
調べてたらこんなのが出てきました
http://jscript.zouri.jp/Source/ExcelCtrl.html#LINK7
ちょっとずれてはいますが、ここで

// シートのマクロ関数を呼び出す
ExcelApp.Run( "MacroTest.xls!Sheet1.func1" );
ってのがあるから、標準モジュールだけじゃなくて、シートの関数も他のシートからも呼べるんだよね
マネてやってみたんだけどうまくいかん
2019/02/17(日) 18:52:24.20ID:EkiBf8gr0
いや、普通に、シートを指定するんじゃ駄目のかな。
>>206はThisworkbookに続けて関数名書いてるけど。
クラスモジュールもそうやって指定するでしょ?
2019/02/17(日) 18:53:32.60ID:X48frccGd
???
lngEle?なんかよりi,j,kの方がよっぽど良いだろ。
どんなスコープの場合でも特別な意味の無いループ変数だよ。
世界中で、さらにいうと他言語でも共有されてる価値観だろ。
まあ、ローカル以外で使われることは無いけど。
251デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 19:03:59.23ID:l7X7saNL0
シートモジュール特有の制約があるのかもしれないけど調べるのめんどい
2019/02/17(日) 19:07:37.68ID:X48frccGd
>>238
根本的に考え方が分かっていない。
まず、色んな所から呼び出したいものは標準モジュールに書く。
そして、そいつを色んな所から利用するように設計する。

君の場合はButtonClear_ClickをSheet1からもSheet2からも使いたいんだからButtonClear_Clickの中身を別関数にして、Sheet1のButtonClear_Clickからその関数を呼び出すようにする。
2019/02/17(日) 19:09:51.42ID:vi4O111wa
vbaerは他の言語やらんから非常識なコードを悪気なく書いてしまうんだよな
2019/02/17(日) 19:12:06.36ID:Rm6p2g7t0
>>252
ちょっと違うんだなあ

sheet1にPrivate Sub ButtonClear_Click()
ってかいてるでしょ。 この処理はシート1に対してする処理なのです
それをシート2から、ある特定のタイミングでしたいので、こうなっている

標準モジュールにあるものはもちろん呼べるけど、疑似的にもそうしないといけないのかな
255デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 19:19:24.91ID:l7X7saNL0
>>254
Worksheets(“シート名”).Range() = 処理
2019/02/17(日) 19:20:23.75ID:EkiBf8gr0
試したら、Sheet2.ButtonClear_Clickで動くわ。
もちろん、Privateは削除でね。

>>252
一般的にはそうだけど、
実際には出来るんだから、思い込みだよ。
257デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 19:22:02.36ID:l7X7saNL0
ていうかsheet1にコードを書いたとしてもsheet2がアクティブになってればそっちに書き込まれるからね
2019/02/17(日) 19:22:44.45ID:Rm6p2g7t0
>>256
Worksheets("sheet1").ButtonClear_Click
みたいな仰々しいことしなくても良かったのね。 ありがと。 あとでやってみる
259デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 19:33:19.37ID:l7X7saNL0
>>258
それは入れる物が間違ってる
2019/02/17(日) 19:50:26.47ID:X48frccGd
>>254
違わない。
設計の話をしている。
シート2からも呼び出すんだからシート1に対して行う処理であっても変わらん。

というか、基本的な所で噛み合ってないな。
どんな所に書いてもいきなりブックやシートの省略はしないのが基本だぞ。
Withを使うかオブジェクト変数で受けるのが基本だ。
2019/02/17(日) 19:56:06.48ID:Rm6p2g7t0
>>256
おかしいなあ。 オブジェクトが必要ですっていうエラーが出てきて動かない
2019/02/17(日) 19:56:59.16ID:9z/u7JpJ0
「ちょっと違うんだなあ 」は草
2019/02/17(日) 20:15:00.10ID:jhLaQWBk0
>>261
君面白いねえ
264デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 20:26:28.38ID:l7X7saNL0
>>261
Sheet1.Select
2019/02/17(日) 20:36:24.20ID:EkiBf8gr0
>>261
これでtestって出ない?

[シート1]
Sub ButtonClear_Click()
 MsgBox "test"
End Sub

[シート2か標準モジュール]
Sub ButtonClear_Click()
 Sheet1.ButtonClear_Click
End Sub
2019/02/17(日) 20:39:08.27ID:Rm6p2g7t0
>>264-265
sheet1.Selectをしなくても、セルへの代入だけなら出来た.。 シート2のボタンを押しても、シート1のセルに書き込まれる
でも、Cells(10,10).Selectみたいなセルの選択をするときは、sheet1.selectをしておかないとエラーになる
267デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 20:43:50.21ID:l7X7saNL0
>>266
書き込みたいシート名を指定する
Worksheets(“シート名”).cells(1,1) =
2019/02/17(日) 20:44:14.77ID:EkiBf8gr0
>>266
こうやって書けば。

Worksheets("Sheet2").Cells(10, 10).Value = "test"
2019/02/17(日) 20:46:06.79ID:Rm6p2g7t0
>>267-268
いやだから、書き込みだけなら、問題なく出来るって書いたじゃん
裏でも出来る
でも、セルの選択とかが入ると、シートをSelectして動かないとダメ
270デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 20:47:37.46ID:l7X7saNL0
>>269
そりゃそうでしょ
271デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 20:53:21.26ID:l7X7saNL0
つーかエラーメッセージ全部貼って見せて
2019/02/17(日) 21:43:11.83ID:de8FYcuQ0
vbaの関数ってデフォルトが参照渡しなんすね
やらかすとこだった
2019/02/17(日) 21:45:56.53ID:kxT8s3Mp0
お前らオブジェクトのこと全然わかってないんだな
馬鹿ばっか
274デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/17(日) 21:57:57.43ID:l7X7saNL0
>>273
答えplz
2019/02/17(日) 23:04:18.50ID:t0Nzx7bGx
こんなスレ見てたら頭おかしなルで
2019/02/17(日) 23:11:53.07ID:kxT8s3Mp0
>>274
継承されたわけでもないオブジェクトから別のオブジェクトのメソッドをどうやって呼び出すかわからんのか?
馬鹿は死ねよ。
2019/02/17(日) 23:38:23.26ID:vi4O111wa
言い過ぎでは?
繊細な人だったら傷付くよ
2019/02/17(日) 23:57:36.39ID:t0Nzx7bGx
シート1内外から呼べるPublicな共通関数を作って、クリックイベントハンドラのコードと他モジュールのコードの双方から呼ぶようにすれば良いだけでは
イベントハンドラを直接コードユーザにコールさせようとするのはおかしい
2019/02/18(月) 00:01:45.68ID:WfgOED4y0
>>272
ByRefもByValも付けずに宣言するとそれはByRefになるって事をかな?
であれば既にやらかしてるのを気づかずにいる可能性があるから過去のモジュールを点検した方がいい
2019/02/18(月) 00:02:49.20ID:5bMGA+jIa
いやよく考えるとイベントハンドラを呼ぶのはおかしいがシート2クラスのメソッドを呼ぶだけなら別におかしくはなかった
それだけでは共通化する理由にはならない
281デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/18(月) 00:59:55.76ID:hC76sm/R0
>>276
へーシートもオブジェクトなのか
全然意識してなかったわ
勉強になったよありがと
でもお前口悪いから友達いなさそうw
282デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/18(月) 01:23:07.51ID:hC76sm/R0
シートモジュールに構造体宣言してハマった記憶がある
そういうことだったのか
2019/02/18(月) 01:23:55.49ID:5t9ctY5m0
頭が悪い 顔が悪い 目が悪い 口が悪い
性格も悪い 手癖も悪い 足腰も最近悪い
酒癖も悪い 女癖も悪い 寝つきも悪い
そんな俺でもその返事の仕方は失礼なんじゃないかな?
とは思うけど。
もしや高度なツンデレさんなのかな?
と、解釈して

次の方 ( ゚д゚)ノどうぞ
284デフォルトの名無しさん (ワッチョイ c701-mnSR)
垢版 |
2019/02/18(月) 06:33:10.39ID:hC76sm/R0
きっと彼の親はVBAに殺されてしまったんだよ
2019/02/18(月) 08:08:58.79ID:MgpZvmd8x
シートもオブジェクトなのか、ってのはちょっと驚いたな
シートどころか自作フォームも含めてGUIで見て触れるもののほぼすべてがオブジェクトだぞ
2019/02/18(月) 08:18:13.27ID:8se8rGxR0
なんか、バカばっかりだなあ
>>269に他のシートにもアクセスできるって書いてあるだろ。何がオブジェクトだよ
ただ、セルのセレクトは出来ないって
287デフォルトの名無しさん (ワッチョイ ff6f-DcjB)
垢版 |
2019/02/18(月) 08:58:38.38ID:AsxIQPE70
前にやってたユーザサポート業務を思い出した
2019/02/18(月) 12:38:44.05ID:UyrImbcld
>>286
バカはお前。
そのセルのセレクトができないと言ってる元の命令がオブジェクトがどういう階層になってるか分かってない典型的な例。

そういう人のコードだから、セレクトなんて必要無いだろうなと先読みしてるんだろう。
何しろセレクトすることなんて極めて殆ど書くことが無い(必要となることが無い)処理だからな。
2019/02/18(月) 13:13:11.83ID:qW3BE+Gz0
ブックもシートもセルもボタンもシェイプもみんなオブジェクトだよ

WindowsはOSそのものがオブジェクトの塊
そういうふうに設計されてる
2019/02/18(月) 13:49:41.69ID:uzxEynMwM
Selectionはイミィディエイトからはよく使う
291デフォルトの名無しさん (ワッチョイ ff7c-wP4P)
垢版 |
2019/02/18(月) 16:12:57.29ID:JTiYKdtz0
化石観たいな臭いレスでも良いけど
もうちょっと面白いレスが観たいな
VBAネタもう飽きた
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況