Excel VBA 質問スレ Part71at TECH
Excel VBA 質問スレ Part71 - 暇つぶし2ch1:デフォルトの名無しさん
21/05/25 12:48:01.06 mepUVc/i0.net
!extend:checked:vvvvv:1000:512
↑同じ内容を2行貼り付けるナリ
ExcelのVBAに関する質問スレナリ
コード書き込みや作成依頼もOKナリ
※前スレ
Excel VBA 質問スレ Part70
スレリンク(tech板)
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured

2:デフォルトの名無しさん
21/05/25 14:39:07.41 Eok9KjPbM.net
↑おつ

3:デフォルトの名無しさん
21/05/25 15:29:32.37 9esnpvbXF.net
>紙の表を目で追いながら画面を見ずにどんどん入力するとか普通にある
下手に補完機能とか発動するとうざいよな

4:デフォルトの名無しさん
21/05/26 13:42:07.91 LJxSJ8rb0.net
時々画面も見たほうがいいぞ

5:デフォルトの名無しさん
21/05/26 18:56:30.36 mkbiTVsAd.net
画像のような処理をするコードを書きたいのですが・・・
整理番号に対してアルファベットがランダムに振られており、それをまとめるというようなコードです。
ただし、まとめたい整理番号は行が飛び飛びになっており固定されております。
forやifなどを少しかじっただけのため、頑張ってみましたが全くできませんでした。
何卒宜しくお願いいたします。
URLリンク(i.imgur.com)

6:デフォルトの名無しさん
21/05/26 19:27:52.83 DrPaJmjh0.net
いつものあいつ

7:デフォルトの名無しさん
21/05/26 20:40:38.47 YzhdN1Yma.net
のんびりやろうぜ

8:デフォルトの名無しさん
21/05/26 20:43:32.54 FIJmCPPEH.net
>>5
法則がまったくわからん

9:デフォルトの名無しさん
21/05/26 20:57:38.79 mkbiTVsAd.net
>>5ですがウンコしてたら閃いてできました。でももしどなたか書いてくださってたら、参考のために見せていただけると嬉しいです。
>>8
整理番号に対してくっついているアルファベットを、重複削除して横向きに整頓したという感じです。

10:デフォルトの名無しさん
21/05/26 22:04:20.25 VymsA87rM.net
ID:mkbiTVsAdはとにかく繊維質と水分を十分に摂って山ほどウンコしろ
そうすればこのスレを必要とする事も無くなるだろ

11:デフォルトの名無しさん
21/05/26 22:11:44.89 XGTO2klA0.net
入力データは違うけど、Ruby で作ってみた
require 'csv'
tmp_hash = { }
input_ary = CSV.read( "input.csv" ) # 2次元配列
input_ary.each do | row | # 1行ずつ処理する
if tmp_hash.has_key? row[ 0 ] # 既に、その数字が存在すれば
# 文字列が存在しない時だけ、その文字列を追加する
tmp_hash[ row[ 0 ] ][ row[ 1 ] ] = true unless
tmp_hash[ row[ 0 ] ].has_key? row[ 1 ]
else
tmp_hash[ row[ 0 ] ] = { row[ 1 ] => true }
end
end
result_ary = tmp_hash.map do |num, hash|
ary = hash.map { |str, b_true| str }
[ num, *ary ] # 配列展開
end
# p result_ary # 2次元配列
# [["1", "A"], ["2", "B", "C"], ["3", "X"]]
csv_str = result_ary.map( &:to_csv ).join # 2次元配列を、CSV 文字列に変換する
print csv_str
出力
1,A
2,B,C
3,X

12:デフォルトの名無しさん
21/05/26 22:16:14.20 FIJmCPPEH.net
>>9
1と3は、整理前と整理後で同じ行にあるけど、2と4が上に移動してる理由がわからん
移動量も違うし
条件は全部文章で書いて

13:デフォルトの名無しさん
21/05/26 22:55:47.72 Ca/oJ0kCM.net
いつものあいつ=ruby馬鹿

14:デフォルトの名無しさん
21/05/26 23:30:39.65 CbYT3Zs7M.net
>>5
Dictioraryを使わずにデータを1列目~2列目、出力先を4列目以降であると仮定する
配列 = Range(Cells(出力先の1番上の行,4),Cells(出力先の1番下の行,4))
For i = LBound(配列,1) to UBound(配列,1)
For j = データの一番上の行 to データの一番下の行
If Cells(j,1).Value = 配列(i,LBound(配列,2) Then
If 配列(i,UBound(配列,2) <>″″ Then
ReDim Preserve 配列(LBound(配列,1) to UBound(配列,1),LBound(配列,2) to UBound(配列,2)+1)
End If
For k = LBound(配列,2) to UBound(配列,2)
If 配列(i,k) = Cells(j,1),Value Then
Exit For
Else If 配列(i,k) = ″″ Then
配列(i,k) = Cells(j,1),Value
End If
Next
Next
Next
ってやって出力するとか?
思いつきで適当にやったから動かなかったらゴメンね

15:デフォルトの名無しさん
21/05/27 01:00:26.94 hl6lLSzud.net
>>12
移動後の整理番号の位置は決まっているだけ という話なのですが... というかそれは書いてあるのですが

16:デフォルトの名無しさん
21/05/27 01:01:43.36 hl6lLSzud.net
>>14
おお ありがとうございます
参考にさせていただきます
>>11
このバカはなんですか?

17:デフォルトの名無しさん
21/05/27 08:26:53.22 f+HvaIKyM.net
>>5
ピボットテーブルでいいやん

18:デフォルトの名無しさん
21/05/27 11:03:53.72 hl6lLSzud.net
>>17
添付画像は簡略化してあるだけなので...
本当に画像みたいなデータしかないんだったらいいかもしれないですが...

19:デフォルトの名無しさん
21/05/28 11:25:16.55 EVw9ke/Wd.net
>>11
頭が悪いの?
大丈夫?
日常生活は遅れてる?

20:デフォルトの名無しさん
21/05/28 12:11:04.92 akPeanIUM.net
>>19
聞いても無駄
自覚できてないからずっとこんなこと続けてるんだろ

21:デフォルトの名無しさん
21/05/28 14:13:31.59 wSpOVLhu0.net
A列がKey、B列がItemが入っていたとして、一括でDictionaryに代入する方法はありますか
今はForで処理していますが、
For r = 1 To 10000
dic.Add Cells(r, 1), Cells(r, 2)
Next r
だと読み込みに時間がかかり、配列のほうが早いくらいです

22:デフォルトの名無しさん
21/05/28 15:04:21.04 TV0Jrg4dM.net
どう頑張っても配列のほうが速いよ

23:デフォルトの名無しさん
21/05/28 16:57:29.10 VcGAYAhXH.net
配列を経由してDicに入れると多少は速くなると思う
確認はしてない
Sub Macro1()
  Dim Dic As Object
  Set Dic = CreateObject("Scripting.Dictionary")
  Dim aa()
  aa = Range("A1:B10000")
  For r = 1 To 10000
    Dic.Add aa(r, 1), aa(r, 2)
  Next
End Sub

24:デフォルトの名無しさん
21/05/28 17:29:35.83 ZW1biLGGa.net
そもそもDictionaryにRange型も入れられるんじゃないっけ?
だから「配列の方が速い」という使い方ならCellsの後にValue付けなきゃいかんのでは

25:21
21/05/28 18:05:19.20 wSpOVLhu0.net
>>23
ありがとうございます。

26:デフォルトの名無しさん
21/05/28 18:55:00.91 dVrlPf170.net
>>21
スピードを求めているの?
ならシートにSQL投げた方が速い場合もあるよ
格納場所はRecordsetになるけど

27:デフォルトの名無しさん
21/05/29 00:17:36.64 EOgZ8Zck0.net
>>24
それだと重複時に例外が出るメリットが生かせないのでは
配列でいいって言ってるから保証出来てるのかも知れないが
(最終的な目的次第では不要な可能性もあるけど)Dictionaryが必須だとしたら、
使用しない行を予めオートフィルターで弾いて読み込む行自体を減らすのがいいと思う

28:デフォルトの名無しさん
21/05/29 09:21:11.45 u1rl2gESM.net
>>23
配列を使うとセルへのアクセスが一万分の一なるね

29:デフォルトの名無しさん
21/05/29 12:21:19.40 tq3mFxPFH.net
>>27
非表示になってるセルもRange型一括だと配列に代入されてしまう
1つずつチェックしながらForで回すしかなくなるから、どっちが速いかなあ

30:デフォルトの名無しさん
21/05/29 12:22:00.64 tq3mFxPFH.net
>>28
2列あるから2万分の一だよ

31:デフォルトの名無しさん
21/05/29 17:06:38.14 7OwGsnto0.net
つかまずディクショナリに入れたいのはRange型なのかそのセルの値なのか
なんにしてもこの程度は一瞬で終わったけどな

32:デフォルトの名無しさん
21/05/29 21:19:22.31 nUzcb4+O0.net
>>26
シートにSQLはよく使うが、
数字が入ってると数字と判定されやすいの何とかならんかな。
IMEX=1も利かないときあるし。
(セルの書式設定で文字列にするのは全然効かん)

33:デフォルトの名無しさん
21/05/29 22:40:30.37 hG567TCp0.net
>>32
あー、あるあるだね
その辺はSQLの書きっぷりで例えば
数値として判断させるならケツに*1くっつけるとか
文字列としてならケツにブランクくっつけてやることで何とかなるけど確かにあまり綺麗な形とは言い難いかもね。

34:デフォルトの名無しさん
21/05/29 22:58:50.78 WsLgMeGM0.net
VBAのユーザーフォームについて、
プロパティウィンドウ上でフォントサイズを変更しようとした場合、
Fontの右側に出てくる[...]ボタンを押して、フォントウィンドウ上でサイズを選択するのが普通ですが、
ボタンを押すとなるとマウス操作が必要になります。
フォントサイズを変更する時に使えるキーボードのショートカットってないですか?

35:デフォルトの名無しさん
21/05/29 23:27:11.67 tq3mFxPFH.net
>>34
F4でプロパティウィンドウに移動、↓でフォントの行に飛んでからAlt+↓を押すとフォント選択ダイアログが開く

36:デフォルトの名無しさん
21/05/30 00:06:02.75 mvwOdKaH0.net
Alt+↓では開きませんでした。
ForeColor等のように、右側に出るボタンが ▼ の項目については、
Alt+↓で選択候補がプルダウンで表示されました。
これは知らなかったので、一つ知識が増えました。ありがとうございます。

37:デフォルトの名無しさん
21/05/30 00:29:48.27 WJGvMidO0.net
>>36
ただの馬鹿だろ

38:デフォルトの名無しさん
21/05/30 00:38:38.89 MeqMpkJCM.net
数が多いときはforで回してフォントサイズを変えた方が楽

39:デフォルトの名無しさん
21/05/30 00:54:31.57 G4EUHehCd.net
>>36
フォントが大量にインストールされてると、ダイアログが開くのに時間がかかる
ほかにも、PictureプロパティとかIconプロパティなんかの[...]ボタンもAlt+↓で押せるはずだから試してみて
それも開かないとなると、何かがおかしい

40:デフォルトの名無しさん
21/05/30 03:54:35.99 wQMimd0a0.net
ところがLinuxなら一瞬で開きます。

41:デフォルトの名無しさん
21/05/30 04:10:38.43 dB+xSga20.net
>>40
そういうことはubuntuでEXCELが使えるようになってから言おうね

42:デフォルトの名無しさん
21/05/30 04:22:57.14 wQMimd0a0.net
なんのために?
ベンダーロックインされてM$の奴隷になりたいの?

43:デフォルトの名無しさん
21/05/30 08:12:15.17 dB+xSga20.net
>>42
やっぱりあわしろ教信者の荒らしか
こいつらとRuby信者はわざわざ自分の巣から出張して来て無関係のスレ荒らすから分かり易い
EXCELが動かなきゃEXCEL VBA動かすことが出来ないだろ?
お前が来ているこのスレの名前を100回読み返してみようか。そうすれば多少頭に血の巡りが悪くても少しは理解出来るだろ

44:デフォルトの名無しさん
21/05/30 10:36:06.08 Qv4D53KHp.net
前スレでボロクソに言われた質問(↓)が解決しないので
再度投稿失礼します。
URLリンク(i.imgur.com)

在庫管理でクロス集計表を使ってるんだけど
配列で取り込んだデータをデータがあったセル位置に戻す時って
どう指定してあげればいいの?
【用途】
納期毎に設定される納品数を在庫から引いて
いつ欠品になるか知りたい
伝わるか分からないけど↓
使ってるフォーマット形式
縦列
部品名
在庫

納期
納品数

45:デフォルトの名無しさん
21/05/30 13:00:04.14 dinHe+wGM.net
Cells(1,2)=123

46:デフォルトの名無しさん
21/05/30 18:38:27.00 Jcut2Kf60.net
>>44
命綱なしで62階建てのビルの屋上からぶら下がり懸垂をすると閃くかもしれんぞ



保証はしないけど

47:デフォルトの名無しさん
21/05/30 18:55:32.31 XECinZnN0.net
わざわざVBA使わなくてもワークシート関数で出来そうだけど

48:デフォルトの名無しさん
21/05/30 19:13:48.00 jqEflkUS0.net
>>44
まるでまだ欠品していないみたいな書き込みだな
そんなことやるひまがあるならさっさと発注しとけよ

49:デフォルトの名無しさん
21/05/30 22:39:10.44 UG6QJe9S0.net
変数 = セルの範囲 を
セルの範囲 = 変数 と逆にするだけ

50:デフォルトの名無しさん
21/05/31 01:50:09.05 BNAesGOH0.net
>>49
そのセルの範囲の指定の仕方がいまいちピンと来ません...

51:デフォルトの名無しさん
21/05/31 02:41:09.27 dSNiA0NIM.net
>>50
2000ボルトの電気ショックでわかるようになるかもよ

52:デフォルトの名無しさん
21/05/31 07:47:27.27 mbhQyuQq0.net
>>50
配列の変数名をTgtAryとするならば
Range(Sheet1.Сells(LBound(TgtAry,1),LBound(TgtAry,2)),Sheet1.Сells(UBound(TgtAry,1),UBound(TgtAry,2)))
で範囲指定できないかな?

53:デフォルトの名無しさん
21/05/31 09:27:03.82 q4AGCTmE0.net
>>52
そいつはsubからend subまで書いてやらんと分からんやろ

54:デフォルトの名無しさん
21/05/31 11:04:15.17 siYzGVpEa.net
>>34
遅まきながら横からながら
マジありがとう! これ知らなかった! 心底欲しかった!

55:デフォルトの名無しさん
21/05/31 11:07:53.40 siYzGVpEa.net
>>54
△>34
◎>35
連投すまんアンカ間違った

56:デフォルトの名無しさん
21/05/31 20:55:53.72 WHx69Kzap.net
>>52
>>53
ありがとう!
ちょっと試してみます!

57:デフォルトの名無しさん
21/06/01 10:59:42.70 FQ8UQ8zIM.net
Workbook_Openで表の処理とその上書き保存(ActiveWorkbook.Save)を同時にこなしてるのですが、直後になぜか.savedがTrueになりません。
しかしその後もう一度手動でWorkboon_Openの中身を実行すると、今度はTrueになります。
上書き保存の可否を聞かれずにファイルを閉じたいのにいちいち聞かれて困っております。どうしたらよいのでしょうか?

58:デフォルトの名無しさん
21/06/01 11:40:20.38 5+ZhhpdnM.net
ひとまずOpenイベントの頭にStop書いてブレイクポイント作ったら開き直してイミディエイトウィンドウにDebug.Print Workbook.Savedって書いたら
F8押して、イミディエイトのDebug.Printの行末をクリックしてEnter、F8押して、イミディエイトのDebug.Printの行末をクリックしてEnter
ってやってみてもWorkbook.Saveの行でTrueになってないか見てみ?

59:デフォルトの名無しさん
21/06/01 13:01:26.91 FQ8UQ8zIM.net
>>58
Savedの行以降、確かにFalseからTrueになってるし、
Workbook_OpenのEnd Sub直前にStop入れてDebugで確認してもTrueでした。
なのに、End SubをまたぐとFalseになります。

60:デフォルトの名無しさん
21/06/01 13:02:39.34 FQ8UQ8zIM.net
>>59
× Savedの行
○ ActiveWorkbook.Saveの行

61:デフォルトの名無しさん
21/06/01 13:31:04.27 sclbkM2r0.net
>>57
こんな感じの参考になる?
URLリンク(officetanaka.net)

62:デフォルトの名無しさん
21/06/01 14:22:21.55 XqGhUQMKa.net
Openの時はActiveじゃないんじゃない

63:デフォルトの名無しさん
21/06/01 15:42:35.04 5+ZhhpdnM.net
ActiveWorkbookじゃなくてThisWorkbookの方が確実ではあると思うけどEnd Subを跨いだ瞬間に変更フラッグが立ってるのがいまいち分からんなぁ

64:デフォルトの名無しさん
21/06/01 16:11:11.07 Mb6qCGemH.net
裏で動かすマクロは、常にオブジェクトを明示しないとバグの元になる
ActiveSheetとか使うと高確率で誤爆する

65:デフォルトの名無しさん
21/06/01 17:18:36.32 Oa7oH/5MM.net
ThisWorkbookにしたり、わざわざSavedにTrueを代入してやっても、End sub をまたぐとやはりFalseになってる……
皆さん指摘の通りなんかブックの指定にミスがあるかもしれないので、もう少し色々試してみます

66:デフォルトの名無しさん
21/06/01 17:24:45.60 5+ZhhpdnM.net
まずないとは思うがSaveの前にDoEvents挟んでみるとかはどう

67:デフォルトの名無しさん
21/06/01 17:57:51.45 Mb6qCGemH.net
わからない時はdebug.printしまくる

68:デフォルトの名無しさん
21/06/01 18:14:30.31 XqGhUQMKa.net
Openイベントが終わったの後に変更があるとか?
例えばピボットの「開いた時に更新する」とか

69:デフォルトの名無しさん
21/06/01 18:44:16.50 sclbkM2r0.net
>>65
だから>>61のリンク先に書いてあるように
Application.Displayalerts使っちゃダメなの?

70:デフォルトの名無しさん
21/06/01 19:21:51.78 lbMsn5ZmM.net
VBAでIEを操作したい。エレメント内のonclickにJavaScriptが設定されてて、引数がthisなんだ。これはどういうコードかいたらJavaScriptがうごく?

71:デフォルトの名無しさん
21/06/01 19:24:00.82 vHFZ5Ijm0.net
いまだにIEとか

72:デフォルトの名無しさん
21/06/01 19:45:29.62 J2N8rWTYM.net
スクリプト動かす必要があるなら泥沼だからやめとけ
SeleniumかRPAかなんかでクリックをエミュレートしろ

73:デフォルトの名無しさん
21/06/01 20:08:45.76 Mb6qCGemH.net
>>70
JacascriptそのままNavigateでたいがい動くけど、実際に試してみた?

74:デフォルトの名無しさん
21/06/01 20:57:47.91 e0ELXQMnM.net
VBAでChromeを動かす方法はありますか?

75:デフォルトの名無しさん
21/06/01 22:41:37.93 u+h0cgO6d.net
VBA Chromeでググれば色々でるが
お前がどう動かしたいか答えるのはエスパーしか無理

76:デフォルトの名無しさん
21/06/01 23:08:53.66 h5EIZiJKM.net
Chrome使っていいんだったらエクステンション作ればよくね
VBAに固執する意味がない

77:デフォルトの名無しさん
21/06/02 10:29:31.20 6cAiGaxYd.net
A列は途中で未記入の行は無し。B列以降は行によって列範囲は不明。途中の抜けは無し。この条件で一番右まで記入されている列は何列目なのかを知る方法をご教示願います。
この列の右に別の列を追加したいのです。

78:デフォルトの名無しさん
21/06/02 11:11:55.45 Xo9eImhQH.net
>>77
UsedRange.Column

79:デフォルトの名無しさん
21/06/02 11:20:06.26 Kwk6Ddry0.net
VBAでIE動かしたいっていうのは社内システムの操作じゃね
自動化しようにもそれしか選択肢がないっていうケース

80:デフォルトの名無しさん
21/06/02 11:27:04.16 Xo9eImhQH.net
そういうのは末端の社員が勝手に自動化して楽しようとしてるケースに限られる
そうでなければシステム部とか管理部がちゃんと対応してくれるはずだし

81:デフォルトの名無しさん
21/06/02 11:35:10.46 Kwk6Ddry0.net
末端しかこんなところにはこねーよ

82:デフォルトの名無しさん
21/06/02 11:40:00.72 IWT/q5/E0.net
IEが2022/6/15にサポート終了する件なんだけど、VBAのIE操作もできなくなるの?

83:デフォルトの名無しさん
21/06/02 11:40:36.31 y9OF8J1M0.net
>>74
これでいいんじゃね?
URLリンク(note.com)

84:デフォルトの名無しさん
21/06/02 12:15:32.36 Xo9eImhQH.net
>>82
サポートの終了と使用の禁止はまた別の話だと思うけどなあ
サポート外のWinXPが起動不可能になったとか聞かないし

85:デフォルトの名無しさん
21/06/02 12:23:59.65 IWT/q5/E0.net
>84
そうだとありがたいんだよね。
ただ記事で「2022年6月16日になっても、iexplore.exeは削除されないものの、アクセスしようとするとIE11は起動せずEdgeにリダイレクトされる」って書いてあったから不安なんだ

86:デフォルトの名無しさん
21/06/02 13:20:52.87 JznBaFAoM.net
createObjectで呼び出すんじゃないの?

87:デフォルトの名無しさん
21/06/02 16:05:40.28 Xo9eImhQH.net
アプリは起動できなくされるけど、オブジェクトはさわれると予想
MS-Officeがもともとそういう構造だったし

88:デフォルトの名無しさん
21/06/02 16:34:22.01 5rGltuVI0.net
ieが来年サポート終了するからchromeとseleniumで動かして見ようと思ったら
webdriverが若干古いのしか公開されてなくて詰んだ
頻繁に更新するchromeをどうやって制御すりゃいいんだよ…

89:デフォルトの名無しさん
21/06/02 23:09:59.70 qivQYfz/r.net
すみません、教えてください
配列の一部の最大値を取得する方法ってないでしょうか?
例えば二次元配列で
a(1,1)=1
a(2,1)=2
a(3,1)=3

a(100,1)=100
という配列があったとして、a(10,1)~a(20,1)の間の最大値を出す方法です
for文で調べたい配列すべて調べて最大値を出す方法しか思い付かないのですが、他に方法はないでしょうか?

90:デフォルトの名無しさん
21/06/02 23:12:53.59 GkUPJJQl0.net
それはギャグで言ってるのか

91:デフォルトの名無しさん
21/06/02 23:43:12.68 y9OF8J1M0.net
Rubyなら何ちゃらかんちゃらの前置きだろ

92:デフォルトの名無しさん
21/06/02 23:59:28.51 6j/qqwIU0.net
>>89
全部の配列を一旦シートにコピーして関数つかえばいいんじゃね

93:デフォルトの名無しさん
21/06/03 00:15:46.47 bA/gzbc70.net
>>89
死ね

94:デフォルトの名無しさん
21/06/03 02:19:06.04 Ers5yK+g0.net
>>88
Ruby には、Webdriver を自動的にダウンロードする、モジュール・gem がある。
タスクランナーみたいなもの
ブラウザの起動前に、ブラウザのバージョンを調べて、
Webdriver のバージョンが、それと一致しない場合、
それと一致するWebdriver をダウンロードしてから、処理を開始する

95:デフォルトの名無しさん
21/06/03 03:06:46.55 WSKbBpAyd.net
まともな企業のLANだとネットアクセスとかダウンロードに制限かかってそう


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch