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
2019/09/30(月) 09:44:23.17ID:5dp60tLcM
その通りにコードを組めばいいです
よかったですね
2019/09/30(月) 14:06:19.14ID:Xo+EVkfu0
そこまでくると質問というより代わりに作ってって感じな気がする
2019/09/30(月) 14:27:24.46ID:KUbJhJ6Ud
15万ぐらい払えば作ってくれるよ
2019/09/30(月) 18:03:03.23ID:uds7JUMo0
任意のフォルダを開きたいくて、そのファイルのパスが
A1に書いてあるときにどんなコード書いたらできますか?だれか教えてください。お願いします🥺
2019/09/30(月) 18:38:27.74ID:MOVpytTQ0
え?w>>124見たいな糞簡単なの作って15万???
うそやろwwwww
2019/09/30(月) 19:38:06.65ID:Db1Fe+X90
>>128
ファイル形式は?
2019/09/30(月) 20:42:31.76ID:rUBZxyEm0
>>128
次から次へと現れる馬鹿
2019/09/30(月) 21:02:52.82ID:KDJog/g4x
>>128
フォルダのフルパスがA1セルに入っているなら、

Shell Range("A1").Value, vbNormalFocus

と書けばとりあえずフォルダを開くことはできる
開いたフォルダの中のファイルを選んで何らかの操作をしたいならファイルそのものを掴む別の工夫が必要
2019/09/30(月) 21:15:26.21ID:VO0MeE9M0
.Findで検索するマクロ作ってるけど死にそう
全シート検索で結合セル気にしないでいい方法ないですか
一致したの全部もれなくとるだけなのに
なんでこんな大変なんですか
2019/09/30(月) 22:05:40.31ID:KDJog/g4x
>>133
何がそんなに大変なの?
2019/09/30(月) 22:43:31.23ID:VO0MeE9M0
初回検索と次項目の検索が別メソッド
検索したあとに問答無用で一周して戻ってくる謎仕様
結合セル最初に見つけたら2週目で見つけられなくて死亡
最初から検索しようとしたら最初の次のセルから開始という超絶理不尽仕様
最終セル開始点にしようとしたら最終セルが結合セルで死亡
2019/09/30(月) 22:55:52.56ID:VO0MeE9M0
http://dsp74118.blogspot.com/2014/08/excel-vbarangefind.html

ってこれなに
うそだろ
2019/09/30(月) 23:15:22.35ID:fjb3wiBS0
あるシートから10000行程クリップボードにコピーして別シートに行挿入する事を10回程度繰り返すマクロがメモリ不足で停止してしまいます。
エクセルは32bitですがメモリ使用量は2.5GB程度、使用率は80%程度なので余裕はあります。
コピー&挿入だけでこんなにメモリ食うのは想定外だったのですが何か良い対策ありませんか?
クリップボードを使ってる理由は書式もコピーしたいからです。
2019/10/01(火) 00:40:37.46ID:1yOvNLR5x
>>137
結合セルがない場合で、書式が行列で統一的に構造化されている(=手動でランダムに設定された書式がない)場合の話だけど、セルの値のコピーはクエリテーブルを使い、セル書式はスタイルとして登録しておいて値をコピーしたあとにテーブル単位で適用するようにする

それができないなら常套手段的な対策として、描画停止、セルの自動計算の無効化、一度のコピー行数の抑制、コピーする情報の量の削減(列を減らす、セルに入れる値の文字列長に上限をつける等)をやるしかない
2019/10/01(火) 00:48:34.75ID:1yOvNLR5x
>>135
検索対象のセル範囲でループを回して、MergeAreaプロパティから取得できる結合範囲の第一セルの値に対してInStr関数でチェックをかけるほうが簡単に実装できる
一度触った第一セルをDictionaryに突っ込んでおけば重複回避の処理も簡単に書けるし
2019/10/01(火) 02:44:48.32ID:xCeEOzji0
1000行を100回にすれば解決する気がする
2019/10/01(火) 20:19:29.97ID:/ilC+Vr+0
>>137
想定して最初から設計しなおした方がいいんじゃね
2019/10/01(火) 20:26:17.87ID:zIavCJ+m0
>>137
一度に全部やらず少しずつやるとか、挿入やめて別シートに貼り付けていくとか
143デフォルトの名無しさん (ワッチョイ e77c-e8W8)
垢版 |
2019/10/01(火) 23:46:40.82ID:SJOrrfFy0
vbaできる人は何歳くらいの方が多いのですか?
144デフォルトの名無しさん (ワッチョイ 87f1-a2LJ)
垢版 |
2019/10/01(火) 23:51:07.99ID:0MgRI3uB0
100才。
きんは100才100才。ぎんも100才100才。
もう死んじゃいましたけど。
145デフォルトの名無しさん (ワッチョイ 87f1-a2LJ)
垢版 |
2019/10/01(火) 23:51:51.43ID:0MgRI3uB0
いまは中曽根元首相が100才だよ。
2019/10/02(水) 10:56:45.47ID:BB7vTg8Dd
>>145
もう101歳になった
147デフォルトの名無しさん (ワッチョイ 87f1-a2LJ)
垢版 |
2019/10/02(水) 16:36:11.08ID:2/U5/wmB0
100才くらいなら健康でも1年後にもまだ生きてる生存率は50%くらいだよな。
そろそろ死神のお迎えがくるかな。
2019/10/02(水) 19:09:20.31ID:TvQrnV1i0
そんな事言ってる人に来るからな
2019/10/02(水) 23:17:24.03ID:gSiaZ46v0
直せるものもろくに直さず
超絶くそのまま世界で最も使われる言語の一つになってしまったVBAに
いろいろ思うところがある

俺らがああしろこうしろと習ってることってどこまで本当なのか
2019/10/03(木) 04:52:33.28ID:MliRm7Y8d
人の言うことなんか信用するな
学校で教えることなんて、諸説あるうちの一つを紹介してるだけ
自分で直接見聞きしたことが真実に一番近い
2019/10/03(木) 05:35:40.04ID:GiO0wfXg0
>>138
>>141-142
細かくコピペするよう変えたのですが、今度はメモリを3.5GBくらい使い始めました。
さすがにおかしいので調べた結果、コピー元のシートの1つがバグってたようです。
現在はメモリ使用量が250MB程度に収まりました。
ありがとうございました。
152デフォルトの名無しさん (オイコラミネオ MMb5-shqV)
垢版 |
2019/10/04(金) 08:52:18.52ID:D6R1G7QwM
質問させてください。
シート上に簡単なHTMLを表示させたいのですが、そのようなコントロールはありますでしょうか?

必要なタグは、br font(color属性のみ) bold div(改行の代わり)くらいです。

目的としては、WEBデータベースに登録されているリッチテキストフィールドをダウンロードして表示することになります。
危ないタグはWEBサービス側で排除されていると思います。
2019/10/04(金) 10:46:00.35ID:oVJ/Q3fQ0
>>152
Microsoft Web Browserコントロールというのがあります
ただしHTMLの設定や変更にはVBAが必要です
2019/10/04(金) 20:22:42.36ID:vt9px/Y/0
>>152
簡単なHTMLと簡単でないHTMLの違いがわからん
2019/10/05(土) 10:01:54.14ID:TWDKigvVd
MSはC#とかTSとか素性のよい言語開発してるのにどうしてマクロは頑なにVBAのみなのか…
2019/10/05(土) 10:16:11.22ID:U/TjAS/YM
企業ユーザーは既存資産が動く事が大事
新しい事は求めていない
2019/10/05(土) 10:21:54.58ID:yF+AhEbea
c#でexcelの読み書きすればいい
2019/10/05(土) 11:06:04.60ID:do1ONn360
>>157
それならそれでいいんだけどMarshall.ComReleaseが面倒すぎる
2019/10/05(土) 14:26:52.59ID:pEFp3YWl0
""とclearcontentsって別物だったんだな。
一部書籍で扱いが同じだったが新刊書で違いが明らかになった。
2019/10/05(土) 15:04:12.76ID:/n5ffSwIx
>>159
どう違うんだ?
2019/10/05(土) 15:20:21.70ID:6m4y9GjGp
長さ0の文字列と値・数式のクリア
2019/10/05(土) 15:24:12.24ID:YItdpMcG0
>>161
何を入れてクリアしてるかを聞いてるのでは
2019/10/05(土) 15:52:41.48ID:/n5ffSwIx
ClearContentsでクリアするとValueプロパティの中身が型未定義のEmpty値になるってことか?
2019/10/05(土) 15:53:36.09ID:U/TjAS/YM
>>161
この2つで異なる結果を返す関数、演算は何ですか?
2019/10/05(土) 18:14:16.86ID:pEFp3YWl0
並べ替え、重複削除、ピボットテーブル、COUNTA関数
2019/10/05(土) 18:21:34.50ID:zs2CzSXz0
違うかなぁ?
typenameは、どちらもEmptyだし。並び替えにも影響しないみたいだけど、、
2019/10/05(土) 19:16:42.87ID:do1ONn360
""のTypeNameはvbStringじゃないの?
2019/10/05(土) 22:49:37.62ID:cygEmLxv0
特定フォルダの中のファイル名を取得したくて、A1にファイルパスが書いてあってあったとき
Dim fname As String fname = "DirSample.xlsx" 
の"DirSample.xlsx"の部分をA1のパスにしたいのですが、どうやった良いですか?
2019/10/05(土) 23:05:00.52ID:I+mWDivyr
fname = range("a1").value & "¥DirSample.xlsx" 
2019/10/06(日) 00:21:58.24ID:DJJ/a1MV0
>>164
=type(a1)
書式を文字列にしてからやってみ
171デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 01:50:18.38ID:yv4ZtA4Er
>>5
このQueryTablesなんですけど、セル内改行を含むCSVを読み込むにはどうしたらいいですかね?
改行コードをいじってみたりしたけど駄目でした
172デフォルトの名無しさん (ラクペッ MM65-CrRW)
垢版 |
2019/10/06(日) 08:08:24.51ID:eVUjMqzVM
>>171
CSVで「セル内改行」?
意味が分からん
2019/10/06(日) 09:32:50.86ID:Lxoa9KpRM
>>172
Excel セル内改行 csv
でググっておいで
2019/10/06(日) 12:19:22.67ID:/4diLxRX0
>>171
Excelのセル内改行コードとテキストファイルの改行コードは違う
2019/10/06(日) 13:05:06.23ID:RDxNCESt0
>>171
CSVのパーサーを自分で書けばいいです
2019/10/06(日) 13:10:14.83ID:H1C9JflMx
>>171
QueryTableをコード内でAddするんじゃなくて、予めPowerQueryでセル内改行の処理を埋め込んだ接続を作っておいて、コード実行時にデータの読み込みとテーブル出力だけすればいいんじゃないの
177デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 21:50:03.52ID:yv4ZtA4Er
>>174
セル内改行をLFにしたり色々試したんですけど駄目でした
結局一時ファイルを作って開いてからコピペという泥臭い処理に…
178デフォルトの名無しさん (オッペケ Srbd-ckhU)
垢版 |
2019/10/06(日) 21:50:35.79ID:yv4ZtA4Er
>>176
PowerQueryですか
調べてみます
179デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 22:04:38.99ID:lVV4IJR90
VBAある表のデータで行と列が一致する列の値を返すコードを書きたいのですがどうしたらいいでしょうか?
行だけならVLOOKUPで行けると思うのですが列になるとどうしてラいいのかわかりません。
該当するセルの値を返したいです。
2019/10/06(日) 22:26:25.54ID:yDN+2LYi0
rangeをfor eachで巡回すればいいんじゃないの
2019/10/06(日) 22:28:18.73ID:H1C9JflMx
>>179
行と列が一致するってどういうこと?

行インデックスと列インデックスが一緒ってこと?

それとも、行と列を特定するための条件が個別にあって、それらの条件を満たすってこと?
2019/10/06(日) 22:57:39.08ID:/4diLxRX0
>>177
コピペするならファイル作らなくてもクリップボードに送ってテキスト取り出し貼ればセル内改行も反映される
2019/10/06(日) 22:59:41.24ID:/4diLxRX0
>>179
何がしたいのか知らないけどVLOOKUPの横版ならHLOOKUP
184デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 23:02:28.07ID:lVV4IJR90
>>181
後者です。
シートに参照する表がありユーザーフォームで作った入力表がコンボボックスとなり
一つ目のコンボボックスが行とリンクしていて、二つめのコンボボックスが列と連動して言いて
行と列の一致した値をテキストボックスに表示させたい。
一つだけならVLOOOKUPでできるのですが表となると私の力だと全く思い浮かびません。
力といってもちょっと基本がわかって参考書とインターネットの中から使えそうなコード
を引っ張ってきて使えるように修正するくらいで一から工程を考え出す事は難しいです。
2019/10/06(日) 23:09:13.37ID:ZjSVYIsg0
ワークシートのchangeプロシージャで
A1:F5  A6:E6 A7:I105  に変更が加わったとき Range("F6") = Date をさせたいのだけど

If Intersect(Target, Union(Range("A1:F5"), Range("A6:E6"), Range("A7:I105"))) Is Nothing Then

ではうまくいきません。どなたか教えてください。

あと、セルに文字を入力するとき、対象となるセルを選択し、文字を入力したら、別のセルに入力途中の文字が表示され、Enterをおしたら対象となるセルに反映されました。
これもどうしたら普通通りになりますか?
186デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/06(日) 23:14:57.48ID:lVV4IJR90
>>183
しいて言うならVLOOKUPとHLOOKUPの合わせる感じ?
2019/10/06(日) 23:34:28.13ID:DJJ/a1MV0
>>185
うまくいきませんとは?
一部だけ反応?反応の範囲が逆?
2019/10/06(日) 23:45:45.30ID:/4diLxRX0
>>186
関数でできないからVBAでやろうとしてるだけなら関数でできる
表がA1:D5だった場合、
=VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
2019/10/06(日) 23:45:57.04ID:ddN6wFVd0
Ruby では、2次元配列[ 行 ][ 列 ]で、そのセルを指せる。
ただし、行列のインデックスは、0 から始まる

require 'csv'

str = <<"EOT"
1,a,x
2,b,y
EOT

p table = CSV.parse( str )
#=> [["1", "a", "x"], ["2", "b", "y"]]

p table[ 1 ][ 2 ] #=> "y"
2019/10/07(月) 07:20:54.28ID:W+vOSLuyr
>>184
重複無しなら、コンボボックスの値が行、列の並びと
同じになるように設定して
listindexを取得
offsetで値を取るとか
2019/10/07(月) 08:45:07.25ID:s6G9KopOM
見出し行の値をkeyにしてrowを取り出すdictionaryを作る
列も同じ様に配列を作る
で、コンボボックスで選択した値で配列から行列番号を取り出す
2019/10/07(月) 13:22:02.42ID:paP7R7pw0
>>177
まず考えるべきはバイナリエディタで該当ファイルを開いて、どういう構造になってるのかを確認することだよ。
2019/10/07(月) 19:22:21.76ID:T7P1X7tV0
>>185
Not抜けてる
2019/10/07(月) 21:18:32.84ID:YYJJYJ590
>186 change自体が動きません
>193 マジッスカ!どこに入れたらいいですか?
2019/10/07(月) 21:59:12.85ID:DI7aKBabr
>>194
ifのあと
196デフォルトの名無しさん (ワッチョイ 5ead-2rUB)
垢版 |
2019/10/08(火) 00:24:14.75ID:HDWpL7A50
〉〉184です。教えてもらった通りVLOOKUPとマッチ関数で作ってみたのですが
うまく言いません。通常のエクセルの状態ではやりたいように動作したのですができればVBAで動作できるようにしたいです、

Sub 行と列()
Dim tateya As String
Dim gouki As String
Dim gouki2 As String
Dim siriaru As String
Dim test As Worksheet
Set test = Worksheets("テスト")
tateya = test.Range("a1")
gouki = test.Range("a2")
haihhun = "-"
gouki2 = tateya & haihhun & gouki '号機
Dim siri As Worksheet
Set siri = Worksheets("シリアル管理")
Dim hanni_seru As Variant '範囲指定はバリアント型を使用する事
hanni_seru = siri.Range("D1:L39")
'VLOOKUP(列の条件,A1:D5,MATCH(行の条件,A1:D1))
siriaru = WorksheetFunction.VLookup(gouki2, hanni_seru, WorksheetFunction.Match("H1", "D1:L1"))
MsgBox siriaru
End Sub
2019/10/08(火) 02:02:42.66ID:l+0JwRkcx
>>196
たぶんMatchの行条件がおかしいけど、どんな問題が起きてるのか分からないから何とも言えない

それから、haihhunとかsiriaruとかhanni_seruとか変数の名前がちょっと酷い
HyphenとかSerialとかとかCellとか英語をきちんと使う意識を持つのが上達の近道だと思う
2019/10/08(火) 07:19:14.43ID:EnS6DjXJ0
〉〉196
その前にまず安価というのはだな・・・
2019/10/08(火) 07:24:09.57ID:XnwML2Ug0
別モジュールに書いたprivate subをcallする方法ってありませんか?
publicにするしか無いでしょうか
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をなぜ使うかの方がわからん
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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