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/11/18(月) 15:42:28.46ID:cwF5jgoMd
>>707
VBEのメニュー上にテキストボックス作って数値とアルファベット相互変換する奴作れば。
2019/11/18(月) 15:43:19.48ID:cwF5jgoMd
>>720
寧ろ列番号の方が必要。
2019/11/18(月) 15:53:04.73ID:cwF5jgoMd
>>722
Range("B1:B10").Value="=SUM($A$1:$A1)"
'関数残したくなければ下を追加
Range("B1:B10").Value=Range("B1:B10").Value
2019/11/18(月) 17:07:56.73ID:S9/8fJfLM
>>734
どんなときに必要なの?
2019/11/18(月) 18:10:29.63ID:7QICIGub0
マクロ実行ブックと同じフォルダ内にある"CCT"というブックに
1つのシートがあって、そのシートをマクロ実行ブックの"CCT1"に貼り付けたいのですが
"CCT"内のシート名が毎回変わってしまうので、変わってもコピペができるマクロをおしえてください

Workbooks.Open ThisWorkbook.Path & "\CCT", ReadOnly:=True
Sheets("*").Cells.Copy ThisWorkbook.Sheets("CCT1").[A1]
ActiveWindow.Close savechanges:=False
2019/11/18(月) 18:25:23.23ID:cwF5jgoMd
>>736
普通はCells(i, j)を使うから
2019/11/18(月) 18:33:30.81ID:cwF5jgoMd
>>737
Worksheets(1)じゃ駄目なん?
2019/11/18(月) 19:06:26.91ID:S9/8fJfLM
>>738
まさかと思うけど、F1~X1のセルの処理を
For C = 6 To 24 ' F列からX列
~.Cells(1, C).~
Next
みたいにコーディングしてるの?
741デフォルトの名無しさん (ワッチョイ 0d7c-RQWt)
垢版 |
2019/11/18(月) 19:14:56.88ID:sS2XhUCG0
vbaを勉強してるのですが、specialcellsとusedrangeの違いが分からないのですが、どんな時に使い分けるのですか?
2019/11/18(月) 19:45:04.18ID:TkavPukF0
どっちも普段使わない
2019/11/18(月) 19:45:09.69ID:cwF5jgoMd
>>740
そんなものは内容による。
Range("C1")のような表現よりも数学的、座標的表現であるCellsの方を使うことの方が多いと言ってる。
2019/11/18(月) 19:46:05.14ID:HkQQG0+L0
>>737
シート名かシートの順番を固定しないと無理
2019/11/18(月) 19:49:12.48ID:HkQQG0+L0
>>741
specialcellsは選択範囲から取得される
usedrangeは選択範囲関係なくシート全体から取得される
2019/11/18(月) 19:50:38.34ID:cwF5jgoMd
>>744
シート1つしか無いと思う。
文が曖昧だから必ずそうとは言えないが。
2019/11/18(月) 19:55:46.17ID:S9/8fJfLM
>>743
お前がそうだというだけの話なのね
2019/11/18(月) 19:56:31.57ID:cwF5jgoMd
>>747
そうだよ。
2019/11/18(月) 19:58:05.76ID:cwF5jgoMd
今までの経験上、組める奴は同意見が多いけどね。
2019/11/18(月) 20:05:00.70ID:NN3IfGCl0
>>740
列方向だけに伸ばす事は少ないけど、

for k = 1 to 3
for i = 1 to 最終行
cells(i,k)
next
next

みたいに二重ループにすることはたまによくあるよ
2019/11/18(月) 20:05:54.63ID:TkavPukF0
>>737
シートが1枚しか無いならブック開いてからアクティブシート取得すればいいのでは
2019/11/18(月) 20:08:35.28ID:OvcXdQbJd
Set
2019/11/18(月) 20:22:40.48ID:lwVIqPwD0
>>748
ならなんの問題もないな

>>749
お前の周りの話だよね?

>>750
いや、その例で
for k = 1 to 3 ' A列~C列
って書いてるってことね
2019/11/18(月) 21:22:26.89ID:cwF5jgoMd
>>753
俺の周りって結構広いんで。
755デフォルトの名無しさん (ワッチョイ e194-qxAY)
垢版 |
2019/11/18(月) 21:40:37.27ID:/hFPyym30
Rubyなら一行で書ける程度の事をVBAは面倒だね
2019/11/18(月) 22:02:21.62ID:lwVIqPwD0
>>754
はいはいw
2019/11/18(月) 22:39:37.88ID:VbUqW+zkx
俺はCells派
任意のセル範囲内での位置座標を相対指定できてめちゃくちゃ便利
Cells(i)もCells(i, j)もよくつかうしSelection.Cells〜とかよくやる
2019/11/18(月) 23:25:47.41ID:NH6dP3qE0
>>728
携帯で打ってるのに無理ゆうなよ。
2019/11/19(火) 06:07:21.04ID:hrMAmFVPa
>>754
ウエストな
2019/11/19(火) 09:42:21.51ID:i5CWN+mw0
>>754
カエルかな?
2019/11/19(火) 12:42:00.23ID:QxFuappz0
>>741
SpeciallCellsのほうはユーザー定義関数で使うと不具合あったはず
762デフォルトの名無しさん (オッペケ Sr11-bUGG)
垢版 |
2019/11/19(火) 22:43:20.17ID:UG4gZLw4r
>>740
RangeをVariantに代入して
For c = 1 To Ubound(Variant)
Variant(1,c)...
が一番楽
だけどRangeが1セルだけの場合上手く代入できない気がする
2019/11/20(水) 13:27:25.20ID:IaTx24D1d
>>762
>>740
いや、だからさ、>>735みたいにしたりするし、その時によるんだよ。
行、列共に多少なりとも組める奴ならアルファベットでアクセスすることは少ないというだけ。
764デフォルトの名無しさん (アウアウウー Sa9d-d1iG)
垢版 |
2019/11/21(木) 15:35:37.98ID:2y1jGWDSa
http://officetanaka.net/excel/vba/tips/tips38.htm

Sub Sample1()
Dim RE, strPattern As String, r As Range
Set RE = CreateObject("VBScript.RegExp")
strPattern = "SUM\("
With RE
.Pattern = strPattern ''検索パターンを設定
.IgnoreCase = True ''大文字と小文字を区別しない
.Global = True ''文字列全体を検索
For Each r In ActiveSheet.UsedRange
If .Test(r.Formula) Then r.Interior.ColorIndex = 3
Next r
End With
Set RE = Nothing
End Sub
このソースのDim REの部分ってこのサブルーチンだけを動かすようなマクロの場合いらなくね?
765デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 15:37:08.52ID:LUwjW7Cja
>>764
間違えたdimでRE変数宣言するのいらなくない?
それとは別の話でset RE nothingはこのサブルーチンしか動かさない場合は必要なくない?
766デフォルトの名無しさん (オッペケ Src5-/8GO)
垢版 |
2019/11/21(木) 16:45:06.69ID:CoNvnJper
>>765
変数そのものがなくても良いって話なのか、宣言がいらないって話なのか?
まあどっちもやりようによってイエスだが、それが推奨されるかは別の話
767デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 17:16:22.54ID:LUwjW7Cja
>>766
プログラム的に何か考慮してるのか聞きたい
プロジェクトでどうするべきか見たいなところは興味ない
768デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/21(木) 17:22:58.39ID:LUwjW7Cja
vbaの設計的にはSet RE = CreateObject("VBScript.RegExp") これだけで初期化できてるからdimで宣言する必要があるのかコンピューターサイエンスサイドの意味で聞きたい
2019/11/21(木) 23:25:18.32ID:BtgKOXu8d
普通は変数宣言を強制するようになってるだろ。
2019/11/22(金) 00:36:07.32ID:kJTMU1Ov0
スモリートインハゲラクター
2019/11/22(金) 01:53:36.59ID:NJe7bE9qx
>>768
モジュールレベルで変数宣言を強制している場合にはプロシージャ内のDimで宣言していないとコンパイルエラーになる
型指定なしのDim宣言ってのは実際にはVariant型変数の宣言なので、代入時に型評価をしているだけだけどね
RegExp型のメモリ領域をDim宣言時に確保するとなると参照設定が必要でそれはそれでまた別の問題が生じる
2019/11/22(金) 11:54:02.74ID:L6bND2U2d
クラスモジュールを使ってオブジェクト指向(厳密には違うらしいですが…)を理解したいと思っています
Newでオブジェクト生成して、get set letを使いながらプログラムを書くという認識で合っているでしょうか?
773デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:01:14.10ID:BVLtoDL5a
>>771
モジュールレベルで変数宣言を強制している場合には必要なのね、ありがとう良くわかった。
set RE = nothingなんだけどこのサブルーチン実行完了したらメモリとか解放されるからnothingやらなくてもスタック領域占有しないと思ってるんだけど実際のところどうなの?そもそも"VBScript.RegExp"の占有ってスタック領域であってる?
そもそもVBAのこの
2019/11/22(金) 12:14:16.35ID:rCku/67RM
発達障害か何かか?
775デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:16:14.12ID:BVLtoDL5a
>>774
教えてよ知ってるなら質問してたからこれも
776デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:19:40.92ID:BVLtoDL5a
実際に正常終了する前提ならset RE = nothingしなくてもメモリリーク起きないのか知りたい
2019/11/22(金) 12:25:56.88ID:rCku/67RM
自分で検証して納得しなさいよ
778デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 12:44:22.42ID:BVLtoDL5a
>>777
やるけど"VBScript.RegExp"の占有領域はスタックかどうかだけ教えて欲しい
スタックメモリだと思ってるんだけど
2019/11/22(金) 12:55:31.14ID:VuiommTl0
>>774
相手するなよ…
780デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 13:00:58.08ID:BVLtoDL5a
>>779
いやここVBA質問スレだよね?
その姿勢は本分を果たしてなくないか
781デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 13:03:14.92ID:BVLtoDL5a
アインシュタイン「6歳の子供に説明できなければ、理解したとは言えない。」
2019/11/22(金) 15:54:34.05ID:ioMkz3g00
6歳って小1とかだよな?
小1が5chか・・・
2019/11/22(金) 16:07:33.42ID:TX54f/dc0
名探偵かよ
784デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 16:59:48.42ID:K4D/35s4a
>>782
小1がやってもいいだろ
例えだよね?
785デフォルトの名無しさん (アウアウカー Sa55-d1iG)
垢版 |
2019/11/22(金) 17:00:31.99ID:K4D/35s4a
お前ら答えられないからって逃げすぎw
2019/11/22(金) 18:58:21.55ID:IgRfeEG+0
CreateObject("VBScript.RegExp")

VBScript のオブジェクトを作っているのだろ。
別のプロセスか、DLL から作っているのだろ

とても、スタックとは思えない
2019/11/22(金) 19:08:12.45ID:/fRhojahr
そもそも占有領域とはなにを指しているのか
VBAのローカル変数はスタックにとられる
それ以上はそのオブジェクト次第
2019/11/23(土) 09:54:08.90ID:W8QCJ151x
>>773
VBScriptの正規表現オブジェクトはIE付属のエンジンだからヒープにインスタンス作成してるだろうし、参照カウンタ0になったら自動破棄されてるんじゃないの
このサブルーチンからの参照がなくなっても別の参照が発生してたらインスタンスは残るでしょ

だから、このサブルーチンが正常終了するかどうかとメモリリークが起きるかどうかは別問題だと思う
サブルーチン外に制御が渡った段階でこの正規表現オブジェクトがどこかのプロセスによって参照されていて、そっちの制御フローの中に猛烈なメモリ負荷が発生する処理が存在すれば、メモリリークの原因になりうる
execループで空文字をマッチさせていてindexが進まずに無限ループしたりとかね

それと、あなたの認識通り、End Subでスタック内のローカル変数のアドレス空間自体が解放されるので、End Subの直前にこの変数SEにNothingを代入する理由はない
モジュールレベルの変数やグローバル変数を使う場合は逆に、制御フロー上の要求としてサブルーチン終了時に参照アドレスをクリアしなければならない場合もある
2019/11/23(土) 10:41:17.70ID:oBrftrQi0
Windows10で、SetLayeredWindowAttributesのLWA_COLORKEYを正常動作させる方法ある?
Windows7でやる方法は知ってるので、7の場合の回答は不要。
2019/11/23(土) 13:40:54.04ID:Rc1avnYX0
with cells(i,j)
.cut .offset(1,0)
.value=k
end with

cells(i,j)にkが入らず、cells(i+1,j)にkが入るんだけど仕様?
2019/11/23(土) 13:47:27.73ID:W8QCJ151x
>>790
普通に

Cells(i, j).Value = k

では駄目なのか?
2019/11/23(土) 14:19:57.78ID:r/KLZ+570
>>790
cut貼り付けでセルそのものが移動してるから
2019/11/23(土) 14:44:54.38ID:2nUI7BT80
ストリートインハゲラクターはここに来ないの?
2019/11/23(土) 17:04:16.03ID:S321d+MCd
>>791
>>792
仕様なんですね
ありがとうございます
2019/11/23(土) 17:11:07.86ID:r/KLZ+570
仕様というか、代入先を自分で変えてることは伝わってるんだろうか
2019/11/23(土) 19:56:27.67ID:mhmkRKEvx
>>790
仕様ではなくて君のコードの動作の問題
同じ綴りのオブジェクト式の記述をまとめる文法ルールとしてWithを理解するのは大きな間違い

Withで任意のセルを取得して和のセルに貼り付けたらEnd Withまでずっと貼り付けられた先のセルを参照する
その状態で.Valueに値を代入したら、当然貼り付けられたセルの値が変わる

With Cells(i, j)
.Cut .Offset(1,0)
End With
Cells(i, j).Value = k

とすれば何の問題もない
2019/11/23(土) 20:39:38.41ID:IdTl1qyV0
>>795
わかってて聞いてるんでしょ
わかってなきゃわざわざ「仕様?」なんて聞き方しないだろうし

With で参照してるセルを変更した時の挙動を書いてるドキュメントは見たことないから仕様かどうかはよくわからん
誰か見たことある人いる?
2019/11/23(土) 22:14:08.35ID:mhmkRKEvx
アンカー間違えてた
>>796>>794宛ね
2019/11/23(土) 22:28:15.56ID:K0UQgc8i0
>>790
仕様
cut後もcells()で返ってくるオブジェクトは同じ
そういや上書きされるcells()はどうなるのか、と試してみたらnothingになっていた
この辺はExcelのカットアンドペーストなどでおなじみだけど、いざやってみると不思議な気分だ

Sub foo()
i = 2
j = 3
k = "k-"
Set before = Cells(3, 3)
With Cells(i, j)
.Cut .Offset(1, 0)
.Value = k
End With
Debug.Print before.Value
End Sub
2019/11/23(土) 22:52:50.40ID:mhmkRKEvx
>>799
不思議でも何でもない
変数によるオブジェクト参照の仕組みをもっと正確に理解すべきだろ
カットは貼り付け先のセルの削除と貼り付け元のセルの埋め込みを伴う処理だぞ
貼り付けを行った段階で、変数のスタックに格納されていた貼り付け先のセルのポインタが無効になるので、貼り付け後に変数の中身を評価するとNothingになるだけ
セルの仕様ではなくオブジェクト参照の仕組みからして当然
2019/11/24(日) 00:00:31.22ID:2ECmUh+O0
しかし、VBAをやり始めたら仕事がはかどるな
面倒くさい勤務表の処理もマクロで一発やからな
2019/11/24(日) 02:13:33.02ID:199iFod20
まるで働いているみたいな言い方だな
2019/11/24(日) 02:19:56.28ID:0nk530rxa
VBAで劇的に工数削減できるような単価の低そうな仕事をしているのなら、
今の仕事の効率化なんかよりプログラミングに習熟してITエンジニアに転職したほうが金を稼げるのではないだろうか
804デフォルトの名無しさん (ブーイモ MM8d-hgyP)
垢版 |
2019/11/24(日) 02:30:35.85ID:n7Fv0omHM
>>803
そのやりかたは?
フリーランサーになればたくさん稼げる?
在宅ワークも可?
2019/11/24(日) 11:11:52.55ID:8CqNLf6R0
>>804
いかがでしたでしょうか?
2019/11/24(日) 11:24:51.53ID:h0SmVkt10
>>803>>804
ここで回答するのもアレだが
VBAは基本的に常駐で保守のゴツイ仕事のみ。仕事自体が少なく稼げない。稼ぐなら別のプログラム言語の方が良い。
在宅の案件は更に無い。ゼロと思ったほうが良い(web業者がついでにAccessのVBAをメンテする、といった事例は聞いたことがある)
2019/11/24(日) 11:58:45.04ID:ZJnm9CLXa
VBAはマクロ記録も出来るし、やりたいことをちょいググればいくらでもサンプルコード載ってるからね
2019/11/24(日) 13:15:25.69ID:ok5C3nrlx
Excel VBA限定の話だろそれ
Outlook とかWordとかPPTのVBAだと途端に情報集めの難易度が上がる
Access VBAは衰退傾向だし
2019/11/24(日) 15:48:03.50ID:cfSGuIz8d
>>789
動作しなくなったの?
あらためて試して無いから分からんけど。
2019/11/24(日) 15:54:08.01ID:cfSGuIz8d
>>807
そういうレベルの話してるから安い話になるんじゃないの?

ググってすぐどうにかなることなんて殆ど無い。
というかググって答えが見つからないことは多い。
811デフォルトの名無しさん (ワッチョイ 9994-1Uwe)
垢版 |
2019/11/24(日) 16:27:31.40ID:IpSlmYmZ0
検索力の問題
2019/11/24(日) 17:31:24.17ID:cfSGuIz8d
>>811
そんなレベルの低い話はしてないんだがw
2019/11/24(日) 17:34:20.62ID:JpcuIalq0
困ったらググれ
2019/11/24(日) 18:56:22.86ID:cfSGuIz8d
>>789
というか、それってExcelそのものに対して透明化したいって話?
それは某掲示板で話題になってWindows10から出来ないみたいな話を聞いたような。
2019/11/24(日) 18:58:17.94ID:C3DnnDsf0
>>809
正常動作しなくなったのは7の時点だけど、その時はAeroを切ってどうにか切り抜けた。
しかし10はどうしたものかなと。
LWA_ALPHAの方は全く問題ないんだけど。
複数のPCで確認したから、おま環ではないと思う。
2019/11/24(日) 19:01:21.70ID:C3DnnDsf0
>>814
透明化したいのはExcelそのもの。
結構便利なんだよ。
ウインドウを2枚重ねても、奥側のウインドウを操作できるから。
2019/11/24(日) 20:13:58.03ID:h0SmVkt10
使えなくなったのか
大昔ハマって透明アプリばっかり作ってた記憶
2019/11/24(日) 21:06:06.38ID:C3DnnDsf0
>>817
使えないっていうか、変な動作をするんだよ。
ThisWorkbook.Application.Hwndでハンドル取ってるのに、
なぜか最初に配置したコマンドボタンのキャプションだけが透過するとか。
2019/11/24(日) 21:33:06.21ID:cfSGuIz8d
>>816
透過はするけど透明にならないんだろ。
無理矢理やる方法は思い付いたけど試して無い。
2019/11/24(日) 21:55:17.62ID:HD00MhY50
ストリートインハゲラクター
2019/11/25(月) 01:13:03.20ID:eciN8Z7y0
透過するアプリがあったなあ昔、なんだっけ。
2019/11/25(月) 03:00:00.82ID:N/R5jHCP0
透明じゃ見えないよ
2019/11/25(月) 08:39:02.81ID:dg2mzwJYd
ググったらサンプルコードが見つかるんじゃなかったのか?
2019/11/25(月) 11:42:30.29ID:R7yXiHMCd
初歩的な質問ですみません
標準モジュールとユーザーフォームでプログラムを書いています
1つのモジュール内にプロシージャが沢山あり、読みにくくなってしまいました
本を読むとクラスモジュールでプログラムが読みやすくなると書いてありました
どのような時にクラスモジュールを使ったらプログラムは読みやすく出来ますか?
サブルーチンやForNext,if等の繰り返し使うものはクラスモジュールを使った方がいいでしょうか?
825デフォルトの名無しさん (ワッチョイ 518e-6LQQ)
垢版 |
2019/11/25(月) 11:52:41.48ID:aBzrxBdk0
>>824
そんなことをここで聞くような人には無理
2019/11/25(月) 14:15:33.91ID:R7yXiHMCd
>>825
わかりました
もっと勉強してきます
失礼しました
2019/11/25(月) 14:41:38.68ID:Md9nMpL2d
ぶしつけで恐縮ですが、シート内の改行を一気に削除する方法を教えていただけないでしょうか。

cellsで指定してreplaceメソッドってやってもできないので、誰かよろしくお願い申し上げます。
2019/11/25(月) 15:12:03.96ID:N/R5jHCP0
新しいシート作って改行をl削除したデータをコピーすればいいんじゃないかな
2019/11/25(月) 15:16:08.90ID:FfR4EE1kM
Dim R As Range
For Each R In ActiveSheet.UsedRange
R = Replace(R, vbCr, "")
R = Replace(R, vbLf, "")
Next

あるいは

Cells.Replace What:=vbCr, Replacement:=""
Cells.Replace What:=vbLf, Replacement:=""
830デフォルトの名無しさん (アウアウカー Sa55-DMja)
垢版 |
2019/11/25(月) 15:30:30.80ID:Q3qCCewla
>>827
VBAスレなんで余談だけど
VBAでやるんなら>>829
手動なら検索窓に「ctrl+J」を入れて全て置換って方法もある
2019/11/25(月) 15:42:49.49ID:FfR4EE1kM
いちおう説明
excel内の改行コードはLFが基本らしいんだけど
マクロ使ったりでCRLFも入力出来るらしい
なのでCRとLFで分けて処理させてみた
2019/11/25(月) 16:52:28.97ID:dg2mzwJYd
結局>>789はどうにもならんのか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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