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/10/23(水) 10:39:27.17ID:9YAnqBFd0
Rangeをつかってセルの範囲を指定した後に
条件を付け加えて条件に合うまで自動で繰り返し処理を行って条件通りになった時に選択セルに文字や数字を入れるにはその下にIfとかで条件を増やしていけばいいの?
2019/10/23(水) 12:32:05.46ID:YTHJUc03r
>>432
条件が簡単で範囲が狭ければ上にあるようにselect caseが分かりやすい
for each c in range("a5:b20")
select case c
case 1
c=c+1
end select
next
2019/10/24(木) 12:24:28.14ID:UjAlYEh+d
>>432
選択セルに入れるというのがナンセンス。
今、ユーザーが選択したセルに入れるという処理はあり得るけど、普通は選択せずに入れる。
2019/10/24(木) 18:18:50.61ID:uab6eG2kM
ExcelでOutlookのメールを処理することについての質問なのですが、ここのスレでよろしいでしょうか。

https://docs.microsoft.com/ja-jp/office/vba/api/outlook.items.getlast
getlastメソッドで、メールを取得するのですが、たまに取得できないことがあります。(たぶんNothing?が帰ってくる。Nothingでない可能性もある。)(メールアイテム以外でも動作確認済。)

getlastメソッドで、取得失敗した場合には5秒待機してもう一度getlastメソッドを行い、最大20回繰り返す処理にしても、たまにメールの取得に失敗します。

ログを確認すると、メールを受信した時間にエラーが起きているようでした。(自身が送信したメールであるかは未確認)

ちなみに、共有受信フォルダに対して処理を行なっています。

メールの取得がうまくいかない原因として何が考えられるでしょうか?
また対策もお教えいただければ。

よろしくお願いします。
2019/10/24(木) 18:54:50.60ID:9FPqNGzPM
getlastしようとしてるオブジェクトが空なんじゃないの
当然何度やってもダメでしょうし
オブジェクトの指定を見直すしかないのでは
2019/10/24(木) 21:16:31.40ID:LTozGfJsr
>>435
マクロ実行のタイミングで新着がある場合に失敗することがある
2019/10/24(木) 22:19:08.24ID:k4Slgj9Ox
>>435
outlookの受信処理と競合して、完全にダウンロードされていないアイテムを掴んで処理が失敗してしまってるんじゃないかな

ActiveExplorer.CommandBars.ExecuteMso ("ToggleOnline")でオンライン/オフラインのモードを切り替えられるので、オフラインモードにしてから受信済のアイテムを操作してみたらどうかな
2019/10/24(木) 23:23:46.93ID:Asf3hx3R0
>>438
解決に近い具体的な解決策ありがとうございます。
少し調べてみて明日組み込んでみます!
2019/10/24(木) 23:31:06.94ID:0B+H0gI/x
>>439
438をポストした者だけど、共有メールボックスではコマンドバー操作を試していないので、うまくいかなかったら申し訳ない
2019/10/25(金) 11:05:50.13ID:dGLThU1d0
>>434
どういう事?
2019/10/25(金) 11:29:44.18ID:cKRHja930
選択されてる範囲に勝手に入力されるのは困ると捉えるか
使う側が指定した範囲に効果を適用したいと捉えるかの違いでは
2019/10/25(金) 22:22:49.14ID:l2RnHcFL0
>>429
むしろ遇奇なら一行ifを使ったほうが簡潔だよ

 If r.Row Mod 2 Then r.Interior.ColorIndex = 6 Else r.Interior.ColorIndex = 1

また、「colorNum」を「r.Row Mod 2」の関数とみなせば

 Dim colorNum(): colorNum = Array(1, 6) '配列で代用
 (中略)
 r.Interior.ColorIndex = colorNum(r.Row Mod 2)

という形になる。
また、「r.Row Mod *」の除数は「colorNum」の要素数なので

 Dim modSecond as Long : modSecond = Ubound(colorNum) - Lbound(colorNum) + 1
 r.Interior.ColorIndex = colorNum(r.Row Mod modSecond)

と一般化できる。
これはIf文やSelect文と違い、colorNumを与えれば三色以上にも動的に対応出来る。

>>441
Selectメソッド使わなくてもセルに入力できるよっていう話だと思う
マクロを記録すると当然セル選択(Select)も全部記録するし、「選択してから操作する」は直感的にも正しいから、
初めてVBAを触る人はSelect必須だと勘違いしやすい
実際は「マクロが動いてる様子が見れないと不安だ」っていう人も少なからずいて、わざとSelectすることはよくある
444デフォルトの名無しさん (ブーイモ MM1f-FIMf)
垢版 |
2019/10/26(土) 12:54:04.66ID:eBBCRY7lM
このまえ職場のITの人が
「サーバがコケた」と言ってました。
「コケた」とはなんですか?
サーバに足が二本あってその足がもつれてサーバが倒れた?
2019/10/26(土) 15:23:13.25ID:ByENxD/q0
すいません
「いま選択しているセル(1セルのみ選択します)の中心に、
[行の先頭(Aの左端)]から[設定されている印刷範囲の右まで]
オートシェイプの罫線を引く」
、というマクロを作成し始めているのですが、
[印刷範囲の右まで] という指定はどのように記述したらよいでしょうか?

いまのところ検索しつつ手習いでこんな記述になったのですが、

Sub マクロ名()
Dim R As Range
Set R = Selection
With ActiveSheet.Shapes.AddLine(R.Left - R.Left, R.Top + R.Height / 2, [     ], R.Top + R.Height / 2).Line
End With
End Sub

[ ]の中に[印刷範囲の右まで]という意味合いを
挿入すればできるのかしらと思っています

[Aの左端]を指定するのに
[選択範囲の右までの距離から、選択範囲の右までの距離を引いたもの]で
距離がゼロになったはウフフ としているのも
「・・・他にビシッとした命令文があるんじゃないかね」と思っているので
ここもご教示いただければ幸いです
2019/10/26(土) 15:26:44.03ID:a/Ne+y1n0
>>374
殿堂入りのコピペにしよう
2019/10/26(土) 15:51:51.18ID:LZqRDs7Rx
>>445
印刷範囲はActiveSheet.PageSetup.PrintAreaで取得できる

印刷範囲の右端列のうち選択セルRと同じ行にあるセル範囲を取得するならば、こんな感じになるかな
試してないのでうまくいかなかったらごめん

With ActiveSheet
.Cells(R.Row, .PageSetup.PrintArea.Columns(.PageSetup.PrintArea.Columns.Count).Column)

End With
2019/10/26(土) 17:22:53.91ID:gStMXt400
列の右端左端の値を取ろうとxltoright/xltoleftを使ったやり方したんだけど、普通に値が入ってるのは大丈夫だったのだけど、計算式が入っているのはダメだった…

どうしたら計算式でも値が入ってる最終、最初の列の値を取れるのでしょう…
一応値貼り付けをしてみたけどダメでした。
2019/10/26(土) 17:42:49.95ID:r1v5ZtYZx
>>448
RangeオブジェクトのCurrentRegionプロパティで解決できる
450デフォルトの名無しさん (ワッチョイ b39e-KT7O)
垢版 |
2019/10/26(土) 18:39:46.37ID:iVpeMUgw0
listviewが使えない状態でフルパスをドラッグドロップで取得したいんですが可能ですか。

vbsでバッチファイル経由でも良いのですが
excel上にマクロボタンを設置し
listviewのようにバッチファイル自体にドラッグドロップするのではなく
エクセル内にドラッグドロップしフルパスを取得したいです。

ご教示お願いします。
451デフォルトの名無しさん (スップ Sd1f-mumX)
垢版 |
2019/10/26(土) 19:02:55.77ID:fijtr2QZd
OutlookとかVBAとかいつの時代を生きてんの?
そろそろ進もうよ
2019/10/26(土) 19:12:27.63ID:KoMfhOgAd
うちもOutlook。しかも2007
2019/10/26(土) 19:24:57.11ID:2Jq8ZMU0x
>>451
Office365でOutlookクライアントネイティブでマクロ実行するときもOutlook VBAが使えて便利だぞ
Excel VBAでもPowerPivotや PowerQueryみたいなモダンな機能を扱えるし何かと便利

あとVBAは古くて癖があるけど、やっぱりMS Office自体は有用だし、他言語でCOM生成したりMS Office Interopを使ったりする手間を考えたらVBAを使う手間と大差ない
2019/10/26(土) 21:43:16.86ID:3NuDJQUH0
【1 OSの種類         .】 Windows10
【2 Excelのバージョン   】 Excel2019
【3 VBAが使えるか    .】 はい
【4 VBAでの回答の可否】 可

ちょっと頭のおかしい感じにしてみたんですけど、どうでしょう?

Sub 猿()
 '@@@@@@@@@@@@@@@@@@
 Dim 日本脳炎, 邪教, 脳梗塞
 '@@@@@@@@@@@@@@@@@@
End Sub

Sub 呪呪呪呪呪呪呪呪()
 '死死死死死死死死死死死死
 Dim あああああああああああ
 '死死死死死死死死死死死死
End Sub
2019/10/26(土) 21:44:56.09ID:w2sb5QGz0
>>454
ここはExcelスレじゃない
2019/10/27(日) 04:54:35.83ID:iIC7Qe/E0
33sands's blog: VBAでpushやpopができる配列クラスを実装しました
http://33sands.blogspot.com/2012/03/vbapushpop.html

このブログで、VBA自作配列クラスが公開されていたようですが、ファイルが消えていました。
ここで公開されていたファイルをお持ちの方はいませんでしょうか?
2019/10/27(日) 07:39:28.03ID:LP8uAzFd0
いないよw
2019/10/27(日) 07:48:21.99ID:5kDmbxH+0
WebArchive
2019/10/27(日) 08:55:23.11ID:1nxyxlWe0
>>449
月曜日に試してみたいと思います。
ありがとうございます。
2019/10/27(日) 09:08:45.25ID:7A1wEn3c0
>>456
そこに書いてある Ubound(配列) + 1 ってのは、よく見かける見る例で、
ループ内で使うと思うんだけど、毎回配列の最大数調べてたら遅くならんかなぁ。
俺は a = a + 1 にしちゃうけど、変わらんか?
2019/10/27(日) 10:16:44.42ID:LP8uAzFd0
>>460
VBAでpushを実装しようと思うとこうするしかないぞ
2019/10/27(日) 11:21:18.40ID:vcUKQgsd0
>>460
たいして変わらんし、多少変わったとしても次の
ReDim Preserve myArray(newIndex)
に比べたらゴミ
2019/10/27(日) 11:24:16.68ID:1nxyxlWe0
>>449
currentregionプロパティで下記のは可能でしょうか?

ABCDEFGHI(列名)
q 12 33 q

A〜I列の内、B〜H列内で数字がある最初と最後の列番号を取得したいと思ってます。

通常では448に書いたようにB〜H列を指定して.ENDでxltoleft/rightを使い2行と2つの変数に結果を入れる事でできたのですが、計算式だとNGだったので(どちらもH列が帰ってきました)
2019/10/27(日) 12:19:45.36ID:jv/fzOi30
>>456
なんで作者本人に連絡取らんの
2019/10/27(日) 13:19:15.84ID:5V6/K/A10
>>463
計算結果が数値の最初と最後の列ってこと?
xlToLeft; xlToRight; はセルが空かどうかでしか判断できないから使えないでしょ?
開始列と終了列からそれぞれなめて、IsNumeric(.value) で判定しないとダメじゃないかな。
なんかいい方法あるけ?
2019/10/27(日) 14:10:23.14ID:lm+G5EAgx
>>456
よく見てないけど計算量最適化できてなさそうだね
2019/10/27(日) 14:42:36.79ID:lm+G5EAgx
>>463
CurrentRegionでは恐らく無理
下のようにループを左右両側から回して調べるしかないんじゃないかな
列番号をチェックする行に含まれるセルを選択している状態という前提です


Dim RngA2I As Range 'チェック対象行のA列からI列までの範囲
Dim i As Long 'ループ用インデックス
Dim LMost As Long '左端列の列番号
Dim RMost As Long '右端列の列番号


With ActiveSheet
Set RngA2I = .Cells(.Cells(Selection.Row, 1), .Cells(Selection.Row, 9))
End With

For i = 2 To 8
If IsNumeric(RngA2I.Item(i).Value) Then
LMost = i
Exit For
End If
Next

For i = 8 To 2 Step - 1
If IsNumeric(RngA2I.Item(i).Value) Then
RMost = i
Exit For
End If
Next
2019/10/27(日) 14:55:15.64ID:vcUKQgsd0
>>466
中身わからんのに計算量を推定できるとかエスパーかよw
2019/10/27(日) 16:12:11.26ID:jv/fzOi30
>>463
With Range("B:H")
'最初
.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
'最後
.Find(What:="*", LookIn:=xlValues, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
End With

値が入ってるセルが1つも無いとエラーになるから事前にチェックしておく
2019/10/27(日) 16:59:16.22ID:5V6/K/A10
>>469
これで数値結果を返すセルを拾えるの?
文字列結果を返すセルも捕まえるみたいだけど、、
2019/10/27(日) 17:02:26.90ID:jv/fzOi30
数字限定?なら>>469は忘れて
472デフォルトの名無しさん (スプッッ Sd1f-mumX)
垢版 |
2019/10/27(日) 17:36:39.44ID:aJJKs/ARd
今の時代でマルチスレッドが使えない時点で終わってる
2019/10/27(日) 17:40:21.78ID:QYdsXE4U0
>>472
マルチスレッドプログラミングは難しいので、なにか適切な抽象化方策が言語でとられるべきかと
2019/10/27(日) 20:13:15.91ID:lm+G5EAgx
>>468
Redimで連続アドレス領域を都度確保するのが効率悪いって言いたいだけなんだが
2019/10/27(日) 20:14:07.93ID:1nxyxlWe0
>>467
やはり両方から確認しにいくのが確実ですよね。
他の部署から来るデータで2シートだけは単純に空白と数値だけなのですが、他のファイルにある1シートだけは計算式入ってたので…

まぁ、最初と最後だけ確認してから他の作業をさせればいいので、これ参考にさせていただきます。
ありがとうございました。
2019/10/27(日) 20:16:11.25ID:1nxyxlWe0
>>469
数値限定なんです。
さらにその数値から●を他のシートに入力していくとかいうメンドクサイ作業も待ってるという…(そっちは早々に作りましたが)

ありがとうございました。
2019/10/27(日) 21:21:01.09ID:rrcAfXPkM
>>474
どこからその都度確保なんて出てきたんだ?
>>456のリンク先のコードはサンプルでクラスモジュールのコードがそのままとかエスパーならわかるの?
2019/10/27(日) 23:13:53.49ID:lm+G5EAgx
>>476
その作業、AccessとかPowerQueryでやった方がいいんじゃないの?
VBAだと車輪の再発明になる気がするぞ
2019/10/27(日) 23:43:54.17ID:qu9l82Nk0
面倒臭いからVBA使うんだろ
2019/10/27(日) 23:53:42.61ID:lm+G5EAgx
AccessやPowerQueryを知らずに言ってるんだろうがテーブルへのクエリをExcel VBAでスクラッチする方が遥かに面倒だぞ
2019/10/27(日) 23:55:56.34ID:qu9l82Nk0
448のどこがaccess、powerquery向きなのか理解出来ない
2019/10/28(月) 01:11:50.89ID:DN6aA2bKa
最初からデータをDBへ入れて扱っていれば「端の値を取る」などというトンデモ要件はそもそも出てこないということだろう
業務ロジックの中でシートの右だの左だの何列目だのとシート上でのレイアウトに依存したコードが散乱するのは典型的な悪夢
2019/10/28(月) 08:44:07.27ID:ECOvCBlTM
448です。
元は手作業でやっていたのを自動化?したいとかで外の会社とかも関わってるので、DB化とかそういう話になるとメンドクサイ事になるらしいです。
自分は他から来ているので、あまり口出しできない状態。

あと、作業の行にカレンダーがあって、そのカレンダーに数字が入力されてる感じです。
なので月ごとに場所が変わったりするので…
そんなのが数百行あるので、少しでもその作業の先頭列が分かれば…と思っていたのですが…
2019/10/28(月) 08:46:00.28ID:ECOvCBlTM
>>482
確かに…
Excelで手作業だったって事もあって、項目によっては行が結合されていたりとかもあってさらにメンドクサイ状態。

そのへんなんとかしてほしいのだが、そうなると外の会社との折衝にもなるらしいのでNGっぽい…orz
485デフォルトの名無しさん (ワッチョイ cfd2-Z4kd)
垢版 |
2019/10/28(月) 11:38:38.31ID:aHKY+muw0
プログラミングスレで聞くのが妥当か分からないけど
マクロの記録を使って「データ分析」ツールをSheet1、Sheet2....Sheet13と起動していくマクロを作ろうとしてるんだけど、どういうわけか「データ分析」で生成された表が現れるSheetと現れないシートにムラがある
規則性はないように思われる
なにかわかることありますかね
486デフォルトの名無しさん (ワッチョイ c3b0-OGTw)
垢版 |
2019/10/28(月) 12:42:09.32ID:w6LeaWY50
Mac版でcontrol+Shift+5で%が付くようにしたのですがこの設定を元に戻すショートカットってありますか?
2019/10/29(火) 04:42:35.22ID:pjDEMxXCM
userformの選択されているcheckboxのcaptionを変数にまとめてautofilterでデータ抽出しようとしているのですがうまくいきません
ちなみにそのような方法でautofilterをかけることは可能でしょうか?
よくわかんない質問ですいませんがよろしくお願いします
2019/10/29(火) 05:23:49.56ID:5vXI5Cgx0
>>487
たぶん。
確か、配列にして渡すんだったと思う。
任意の複数選択フィルタリングを記録すればどう書けばいいかすぐわかるハズ。
2019/10/29(火) 17:33:39.24ID:VP7O6DBE0
看護師の勤務表を作りたいけど何からやればいいか分からないです。教えてください
2019/10/29(火) 17:46:30.71ID:/hC7c7vt0
単純に勤務表ってだけなら表計算でできることなのでエクセルスレへどうぞ(厳密には表計算ですら無いけど)
VBAは大雑把に言うと表計算だけでは実現でいないことをやるための技術です
2019/10/29(火) 17:51:20.57ID:VP7O6DBE0
VBA使わずに自動で1ヶ月分作れるんですか?
2019/10/29(火) 18:01:49.00ID:489rbQ/pd
Office365のカレンダーがいいよ
2019/10/29(火) 18:03:40.61ID:/hC7c7vt0
その場合は必要
後出しで条件を追加すると話が長くなるし回答も二度手間になるので最初にやりたいことをきっちり説明すべし
2019/10/29(火) 18:11:33.96ID:NgUa+H/Id
配列に入ってる値をセルに一個ずつ入れたいのですが、

for i = LBound(配列) to UBound(配列)
Cells(i.1).value = 配列(i)
Next i

こう書くと型が違いますとエラーになります
どうすればいいですか?
2019/10/29(火) 18:12:54.47ID:xRagZ8fLM
勤務表を自動で作成したいとなれば、アルゴリズムの知識がないと実装できないと思う。ナース・スケジューリング問題とか調べてみるといい。参考になる文献が出てくる。ただ、いっそのこと有料ソフトを買った方が早い気がする。
2019/10/29(火) 18:23:00.38ID:nykYL9OH0
>>494
そらi=0から始まるけどセルに座標0はないんで
2019/10/29(火) 18:26:41.51ID:cRJ9A2Q6r
>>494
range("a1").resize(Ubound(配列)ーLbound(配列)) = _
worksheetfunction.transporse(配列)
2019/10/29(火) 18:28:33.17ID:cRJ9A2Q6r
訂正
transpose
2019/10/29(火) 18:35:46.74ID:nykYL9OH0
Cells(i+1,1).valueかCells(1,1).Offset(i,0).valueにする
500デフォルトの名無しさん (ワッチョイ cf8e-FPtM)
垢版 |
2019/10/29(火) 18:36:33.04ID:CZCLEAoQ0
>>489
馬鹿は死ね
501デフォルトの名無しさん (スップ Sd1f-mumX)
垢版 |
2019/10/29(火) 18:41:35.33ID:VPqdpMYqd
エクセル以外のソフトをインストール出来ないってアホみたいな環境はソッコーで辞めた方が良い
VBAなんて将来性もないクソ言語を覚える意味は全くない
本当に他の開発環境は無理なの?
冗談だよね?
2019/10/29(火) 19:27:11.79ID:VP7O6DBE0
>>500
おう。お前が死んどけ
2019/10/29(火) 19:48:08.52ID:+Y5A9Qhrp
>>494
取り敢えずみんなが言ってる通り配列のインデックスは0から始まるし
Cellは行にしても列にしても1から始まるのでそこんとこ気をつけなければいけません。

後はセル指定する際にはブック、シートも指定しておく癖をつけておくことをお勧めします。
2019/10/29(火) 19:57:54.69ID:+Y5A9Qhrp
>>501
仕事場によっては、特に銀行系は
使うもの以外勝手にインストールしてはいけないところが多々有ります。

例えばJavascriptだけ使ってればいいのに
勝手にVisualStudoやTOMCATとかをインストールすると怒られるどころか
コンプライアンスの面から仕事場を退場させられる場合もあります。

EXCELは大概どこの仕事場にも入っているから
インストールしなくても使えるだけで、
当然入れてはいけないと言われたら勝手に入れるべきではありません。

むしろ「勝手にどんどん何でもインストールしていいですよ〜」なんて仕事場があったら
そこのセキュリティはどうなってるのか疑うべきと思われます。
505デフォルトの名無しさん (ワッチョイ e394-mumX)
垢版 |
2019/10/29(火) 20:03:23.90ID:tCyp/No90
マクロを許可してる方がセキュリティ意識ゼロ
2019/10/29(火) 20:06:27.60ID:b5zWL0uJ0
開発メンバーは基本何でもできるからしょうがないだろ
Excelマクロがだめなら開発環境の言語使うわ
2019/10/29(火) 20:10:23.13ID:zvctnIdZ0
cmdとか使える時点でセキュリティも何も合ったもんじゃないと思うけどね
2019/10/29(火) 20:22:40.07ID:OodB9NB80
>>496
>>497
目から鱗ですありがとうございます
早速明日試してみます
2019/10/29(火) 20:28:16.99ID:OodB9NB80
>>503
ご教授ありがとうございます
めっちゃすっきりしました
やっぱり1人でうんうん悩むより聞いた方が早いですね
勉強になります
2019/10/29(火) 23:06:14.03ID:G3O8ZbaI0
鱗付いてるとか爬虫類かよ
511デフォルトの名無しさん (ワッチョイ cf8e-FPtM)
垢版 |
2019/10/29(火) 23:35:46.46ID:CZCLEAoQ0
>>502
死ね、クズ
2019/10/30(水) 10:46:19.82ID:YBm8xQnu0
>>510
爬虫類のわけないだろ
2019/10/30(水) 10:55:31.55ID:YKBvUaHsd
>>441
>>443
少し組める人は絶対にSelectを使わないという姿勢で組むものです。
何故なら無駄である上に速度が低下するので百害あって一利無しだからです。
しかし、ごく一部Selectしないと実現出来ない処理があります。
形式を選択して貼り付ける処理などがそれです。
それから>>443さんのおっしゃるようにユーザーに選択している場所を提示するためにわざとSelectする場合もあります。
2019/10/30(水) 11:02:18.69ID:YKBvUaHsd
>>501
結構多いし、そもそもExcelだけでどうとでもなるから。
能力の低い奴はExcelのせいにするけど、こっちは君が対応出来ないことも出来るんだよ。

確かにどうにもならないことならその時にはじめて他のソフトを検討するけどね。
2019/10/30(水) 11:04:17.20ID:YKBvUaHsd
>>503
>>509
配列の設計はどうにもならんの?
別に1始まりにも出来るし、2次元にすればもっと良い。
2019/10/30(水) 11:07:13.09ID:YKBvUaHsd
>>504
勝手に入れる奴はそもそも居ないでしょ。
Excelは大概どこの仕事場にも入っているのは事実だけど、それが理由ではない。
入っていなければ最初から選択肢に無いし、このスレに書き込んでもいない。
2019/10/30(水) 17:43:14.91ID:qmgosQ7XM
>>487
>>488
Dim i As Integer
Dim n As Integer
Dim 検索値(0 To 3) As String
n = 1

For i = 1 To 4

If Me.Controls("CheckBox" & i).Value = True Then
検索値(n) = Me.Controls("CheckBox" & i).Caption
n = n + 1
End If
Next i

ActiveSheet.Range("$A$1:$J$41").AutoFilter Field:=2, Criteria1:=Array(検索値), Operator:=xlFilterValues


素人ながらにこんな感じで書いてみたのですが、こうするとチェックした項目だけでなく空白セルもautofilterもかけてしまいます。
どうしたら空白セルを除外することができますか?
2019/10/30(水) 20:32:13.04ID:xO9FzZTbr
end ifの前にredim preserve 検索値(i)は?
519デフォルトの名無しさん (ワッチョイ e394-mumX)
垢版 |
2019/10/30(水) 20:57:54.67ID:LQeJyD4+0
VBAのユーザーフォームはWindows98の時代で止まったまま
あれじゃあ恥ずかしいよね
2019/10/30(水) 21:12:32.09ID:q2N5Gpbg0
2019でファイルを開いた時に、勝手にコンボボックスのクリックイベントが発動するんだけど、何で?
もちろん、ワークブックのクラスには何も書いてない状態。
2013ではそんな事なかったと思うんだけど。
このせいで、一切編集せずに閉じようとしても、いちいち保存するか聞いてくる。
2019/10/30(水) 21:15:30.81ID:CYvJIfr60
>>517
だいたいそんな感じですね。
以下で行けました。(Dim文、略)
Control名いじるのが面倒なので、FrameにChkBox
つっこんで回しています。

iCnt = UserForm1.Frame1.Controls.Count - 1
ReDim ARR(iCnt)

i = -1
For Each vBuf In UserForm1.Frame1.Controls
  With vBuf
    If .Value = True Then
      i = i + 1
      ARR(i) = .Caption
    End If
  End With
Next

ActiveSheet.Range("範囲").AutoFilter _
  Field:=1, _
  Criteria1:=ARR, _
  Operator:=xlFilterValues
2019/10/30(水) 21:19:32.90ID:JfXI2Ieyx
>>520
アドインでアプリケーションレベルのイベントハンドラ動かしてるとかじゃないの
2019/10/30(水) 21:22:06.27ID:naugAKCN0
ワークブッククラスの話までできるなら切り分ければいいのに。
2019/10/30(水) 21:37:14.35ID:q2N5Gpbg0
>>522
アドインを無効にしたり、
ワークブックオープンイベントの最初にEnd入れてみたりしたけど、ダメだった。

>>523
最悪は違う手を考えるけど、こんな変な仕様だったのか?と思って。
2019/10/30(水) 21:39:34.26ID:q2N5Gpbg0
↑ワークブックオープンイベントの最初にEndって、アドインの方ね。
2019/10/30(水) 21:45:25.88ID:q2N5Gpbg0
↑クリックイベントだけじゃなくて、チェンジイベントもだった。
何もチェンジしてないっての。
2019/10/30(水) 21:54:49.68ID:JfXI2Ieyx
>>525
Worksheet_Activateイベントあたりが悪さしてるんじゃないの
シートイベントってほんとにゴチャゴチャになりやすいから
2019/10/30(水) 21:55:52.89ID:gwpyZLjKM
ある数値が範囲(***-***)や、範囲と単体の組み合わせを、カンマで区切っているのを降順に配列に格納したいけど、なんか上手くいかないです。

全部VBAでやろうとしているから…なのかな?と思い始めてます。
それ用のシートを作って、そこに1つずつ入れてソートさせた方が簡単…なのでしょうか?
2019/10/30(水) 22:06:31.14ID:JfXI2Ieyx
>>528
10, 5, 1-3, 6 7-9, 11
みたいに数字が並んでるのを、カンマ区切りの文字列ではなく数字の評価をした上で降順ソートしたいってこと?
まず今手元にあるコードを書いてくれ
2019/10/30(水) 22:18:54.50ID:q2N5Gpbg0
>>527
それも見たけど、ないなぁ。
ていうか、コンボボックスが置いてあるシートがアクティブじゃなくても発動するし。

2013では、VBAでオブジェクトにフォーカスを移すと、
初回のみカーソルが見えなくなる現象が起きたと思うけど、
その対策として何かやってたりして。
2019/10/30(水) 22:21:08.45ID:TIjegGw30
>>528
VBAでもシートに書き出してからでもどっちも大した手間は無いよ
まず範囲を1-3なら1,2,3と展開して全体をカンマ区切りだけにしてから、
前者なら配列に格納→配列の中身を降順でソート
後者ならシートに貼り付け→ソート機能使えばいい
2019/10/30(水) 22:34:12.92ID:JfXI2Ieyx
>>530
実装レベルでの不具合の可能性もあるし、ブックのxmlだけが壊れてる可能性もある
コンボボックス以外のオブジェクトの挙動は試してみた?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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