1 名前:デフォルトの名無しさん [2017/11/08(水) 11:26:30.13 ID:+KUB1/9hd.net] スレ立ての際は一行目に !extend:checked:vvvvv:1000:512 と入れてスレ立てして下さい ExcelのVBAに関する質問スレです コード書き込みや作成依頼もOK ※関連スレ VBAなんでも質問スレ Part2 mevius.2ch.net/test/read.cgi/tech/1432173164/ Access VBA 質問スレ Part1 mevius.2ch.net/test/read.cgi/tech/1328536426/ Excel総合相談所 126 https://mevius.2ch.net/test/read.cgi/bsoft/1496487719/ ※前スレ Excel VBA 質問スレ Part50 mevius.2ch.net/test/read.cgi/tech/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)
255 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 23:35:03.26 ID:Yv0FOuti0.net] >>246 一年前に作ったコードの宣言部分と代入部分見ずになんの値か把握できる自信があるならどうぞ まだシステムハンガリアンの方がポリシーあるだけマシ
256 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 23:36:51.22 ID:Yv0FOuti0.net] レスの相手間違えたわ >>242 に対するレスね
257 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 23:47:28.66 ID:Sg1k8TV00.net] >>248 俺が>>246 で言った意図は、「引数名は大事だがローカル変数名はたいして大事じゃない」という意味だ。 それに反論しているのかな?
258 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 09:00:43.39 ID:/OBEl30Ad.net] 大事じゃない変数なんてないんだよ みんなそれぞれに役割があって、一生懸命に生きてるんだから
259 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 09:30:00.33 ID:ci9PkC0t0.net] >>250 それは違うだろ まあ、使い捨てのテストなんかは適当にやるけど 長い変数名が嫌なのは打つのが面倒だからなんだろうけど、そもそも同じ変数が何度も出てくる時点でリファクタリングの臭いがするわけでな
260 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:10:58.75 ID:A1ZwwN/70.net] >>252 ローカル変数に限っていうなら、上の方がよくて下に行くにしたがって悪くなると思っている ・ローカル変数がない ・tmp とか a とか x とかいう名前で十分わかる ・適切な名前をつけることでよくわかる ・適切な名前がつけられていないことで混乱する ・適切な名前がつけられているにもかかわらず混乱する そうだよね?
261 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:15:24.53 ID:hep87Sd80.net] >・適切な名前をつけることでよくわかる >・適切な名前がつけられていないことで混乱する 同じことじゃね?
262 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:16:38.23 ID:KMInKg0R0.net] ソンタクして変数名にvarを採用
263 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:24:16.70 ID:A1ZwwN/70.net] >>254 いや、 やれば改善する可能性があるのにやっていない状態、ということで下位になっている
264 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:44:51.98 ID:DTyNodR2M.net] >>251 底辺のお前も頑張ってるもんな w
265 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 11:50:05.48 ID:ApNVvKeX0.net] >>253 ローカル変数がないの意味がよくわからん 値渡しの引数はローカル変数なんだけど それを除外したとしても、変数なしで書ける処理は限られてくるし
266 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 12:54:24.61 ID:pGcZHtwF0.net] >>258 不要な変数を作るなってことだろ そのまま代入すりゃいいのに>>224 みたいにいったん変数に格納したがる奴は一定数いる
267 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 12:56:36.30 ID:OTnHPyYR0.net] VBAからどんどん離れて公開オナニーになってきた
268 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 13:04:15.84 ID:ci9PkC0t0.net] >>253 tmpとか、座標系の短い変数はきちっと関数化して処理の分断ができてるときに限るけどね 大体そんなもんじゃないかな >>259 配列に格納してから云々はそれぞれの処理を独立させることであとから見通しがよくなるんだよ たとえば、代入する値に条件付きで何らかの処理を加えなきゃいけなくなったときなんかにループしながら直接吐き出してるとネストが深くなって可読性が低くなる それぞれ独立してれば関数化するのも楽だしな
269 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 13:33:08.74 ID:pGcZHtwF0.net] >>261 > たとえば、代入する値に条件付きで何らかの処理を加えなきゃいけなくなったとき その時にやればいいだけ
270 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 14:16:29.61 ID:ci9PkC0t0.net] >>262 一回変数にいれることでそれがなんの値か、というのを明示するって意味もある 意味があるからやってんだよ
271 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 14:40:03.00 ID:pGcZHtwF0.net] >>263 >>216 ならコメントで十分
272 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 15:20:43.89 ID:A1ZwwN/70.net] >>258 日付が変わっているからIDは違うが、元の俺の発言は>>250 の >「引数名は大事だがローカル変数名はたいして大事じゃない」という意味だ。 なんだよね。 つまり引数は別として狭い意味のローカル変数について語っている。 それと、>変数なしで書ける処理は限られてくるし については、良い〜悪いの序列の話なので、「変数なしで書けるくらいスコープが狭い方が良い」ということさ。
273 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 16:18:08.52 ID:t/ZpdAAca.net] ( ・ω・)∩シツモーン 範囲A1:C10の値をまとめてD1:F10に代入するときにさ 直接=で結ぶと駄目で 一旦変数で tmp=range(A1:C10).value range(D1:F10)=tmp とかいうふうにすればオッケーなのって何でなのん?
274 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 16:56:09.10 ID:A1ZwwN/70.net] >>266 Range(A1:C10).Value = Range(D1:F10).Value でいけると思うけど?
275 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 17:06:14.25 ID:A1ZwwN/70.net] ごめん逆 >>266 のやりたいことは Range(D1:F10).Value = Range(A1:C10).Value だね
276 名前:デフォルトの名無しさん mailto:sage [2017/11/26(日) 17:18:28.93 ID:ApNVvKeX0.net] 値のコピーは Range("D1:F10") = Range("A1:C10").Value
277 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 09:03:15.77 ID:3l0DMD54a.net] 範囲が同じなら R1.Value=R2.Valueで行けるな、普通に Set R1=R2はなんか無理 R1=R2でいけない理由はよくわからん RangeオブジェクトのデフォルトプロパティってValueだよね?
278 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 12:39:02.79 ID:Hzamsy590.net] >>270 Rangeの既定のプロパティは、ドキュメント上だとItem 実際はちょっとトリックがあって、_Defaultっていう隠しプロパティ こいつがアドレス指定しない場合はValueを返す
279 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 22:21:45.18 ID:HF1f2kGW0.net] >>270 Setを使うということはオブジェクトということだぞ。 それはRangeそのものを代入することを意味する。 A1セルにB1セルを代入など出来よう筈が無い。 A1セルのアドレスがB1? 意味不明だろ。
280 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 22:54:13.44 ID:scsxtpuJM.net] indirectの悪口はそこまでだ
281 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 23:55:45.37 ID:++h0dxh80.net] indirectが未だに理解できない
282 名前:デフォルトの名無しさん mailto:sage [2017/11/27(月) 23:58:34.84 ID:VuuuCAGm0.net] >>272 rangeオブジェクトの実体はアドレス情報ってことか?
283 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 02:02:42.04 ID:+NcnLu/Q0.net] >>275 ??? それだけじゃねーだろ。 が、それも含むのは当然。
284 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 07:27:08.64 ID:ZnyBsd4x0.net] indirectとかsumproductとか、便利なんだけどいまいちよく解らんよな。
285 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 09:30:34.94 ID:PHeqRDr40.net] 忘れちまえよindirectの事なんか
286 名前:デフォルトの名無しさん [2017/11/28(火) 09:41:03.64 ID:/j8R3q5Od.net] >>272 Set の左辺は変数だから当然と言えば当然 A1セル自体は変数じゃなくてオブジェクトだからな
287 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 10:01:09.63 ID:mtOclWiza.net] >>276 いやまあ、セル同士を直接セットが無理っぽいのは何となく感覚でわかるんだが、どういう動きでそうなってんのかなーって気になるわけよ
288 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 12:43:56.96 ID:ZLcA5r8L0.net] Range()みたいなのって返却値がRangeクラスなだけあってRange()自体は関数だから
289 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 14:06:44.13 ID:WkhkCF1D0.net] Rangeオブジェクト Rangeプロパティ Range関数 Rangeでチン これが区別できれば完璧
290 名前:デフォルトの名無しさん mailto:sage [2017/11/28(火) 22:19:20.97 ID:0EijvfTXM.net] ら...らんげ? (´・ω・`)b
291 名前:デフォルトの名無しさん mailto:sage [2017/11/29(水) 19:36:16.84 ID:vIwO7IkJ0.net] >>281 getRangeにしとけよな 紛らわしいわ
292 名前:デフォルトの名無しさん [2017/11/30(木) 20:52:21.44 ID:Acf/eaNYa.net] リストを絞り込み別のリストで1行だけを表示できるようにしたらどうしたらいいでしょうか? わかりやすくいうと、sheet1にA1からZ1000までのリスト置き、それを何らかの方法で絞込 sheet2のEの1にE列の絞り込んだ1行目をEの2にF列の1行目を表示し次へを押すと2行目を表示するようにしたい オートフィルみたいなことですが表示したいセルが文文章で多くそのセルだけを表示できるようにしたいです。 1行だけならなんとなくわかるのですが次の行にコマンドボタンを押すことで表示する方法はイメージできません。 for文ならiを使えばいいんでしょうけどやりたいことと違う
293 名前:デフォルトの名無しさん mailto:sage [2017/11/30(木) 21:50:06.23 ID:ECoRVPVY0.net] >>285 Find関数使って検索してヒットした行数を返すようにして、 受け取った行数を元に情報を取得、次へボタンはFindNextにしておく。 というのが一番簡単かなぁ。本当はExcelじゃなくてAccessで扱う方がやりやすいんだけど。
294 名前:デフォルトの名無しさん [2017/12/01(金) 14:32:31.35 ID:4uYh51s/0.net] 以下不明点を教えて 1なぜ変数を初期化するのか? 2なぜNextjでjだけループが終わるのか? 3If Hantei Then (もしも変数の場合は。。。) もはや意味がわからない 初心者にもわかりやすく答えよ Sub CorrectCode() Dim i As Long Dim j As Long Dim Hantei As Boolean '変数の値を初期化する Hantei = False For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row For j = 2 To Cells(Rows.Count, 3).End(xlUp).Row If Cells(i, 1) = Cells(j, 3) Then '変数に"True"を代入する Hantei = True Exit For End If Next j If Hantei Then '変数の値を"False"に戻す Hantei = False Else 'セルの背景色を変える(チェックする) Cells(i, 1).Interior.ColorIndex = 6 End If Next i End Sub
295 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 14:54:37.77 ID:RC6w6Z/F0.net] >>287 Next j の捉え方からすると、そもそも実行の順番が分かっていないようなので基礎からやる事をおすすめする。
296 名前:デフォルトの名無しさん [2017/12/01(金) 15:05:39.92 ID:4uYh51s/0.net] 俺なりに日本語訳してみた 間違っていたら教えてくれ VBA初めて3日です 基礎は本読んでるからわかっている 変数宣言 変数に初期値を入れる わかりやすいように 変数iは2から一番下からみて最初に値の入ってセルまでをループする 変数jも同様 もしもA列とC列にループする上で同じのが見つかったら 変数にTUREを入れる そしてループを抜ける そんでまたjのループを繰り返す もしも変数がTUREをもっていたら FALSEに変える → なぜ? セルの
297 名前:色を変える そんでiのループを繰り返す [] [ここ壊れてます]
298 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 15:48:12.50 ID:AGjDU3vg0.net] 初期値をfalseにする理由 trueの時は色づけという流れにしたいので、予めfalseにしておく必要がある boolean型の初期値はtrueなので。 途中でfalseを入れる理由 i=1 のままで j を最終行までループさせてチェック その次に i=2 にして j を同じく最終行までループさせてチェックするのだが i=1 でのチェックが終わった結果 true なら i=2 でのチェックに備えて false に初期化する必要がある これは基本的に最初の初期化と同じ考え方
299 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 15:49:27.01 ID:Mw452gW7E.net] Hanteiの初期化、j のループの直前に置けばIf文の後の変数初期化がいらなくなる気がする・・・
300 名前:デフォルトの名無しさん [2017/12/01(金) 16:20:04.74 ID:4uYh51s/0.net] >>290 なるほどわかりやすい このプログラムを日本語化して
301 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 16:42:02.13 ID:xc+Vk5Dr0.net] >>287 最初の変数初期化は全く必要無い。 そもそもこういうBooleanな変数を用意することに疑問。 こういう変数は、どうにもそれが無いとプログラムが組み立てられない時に使うべきで、出来るなら使わない方向で組み立てるべき。 そして、やってる内容を見ればこんなもの使わない方向で組み立てられる。 こういうコードはやりたいことを論理的につめられていない時に安易に書き出してしまった時になりやすい。 はっきり言ってクソコード。 全く参考にならん。 1.最初の初期化はいらん。 宣言後の初期値はFalseだから。 逆に初期値をTrueにする場合は初期化が必要。 途中の初期化については、jに関する1つの処理が終わった時にTrueになってたら次の処理の結果がおかしくなるから必要。 2.Exit Forのことを言ってるなら最も内側のFor Nextから抜けるからとしか言えん。仕様だね。 3.If〜Thenは〜がTrueかどうかを判定している。 If i=0 Thenはiが0だったらと考えがちだが正しくはi=0の文がTrueかどうかを判定している。 イミディエイトウィンドウに?(10=10)と入力してEnterキーを押すとTrueとなるし?(10=5)と入力してEnterキーを押すとFalseになる。
302 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 17:52:43.75 ID:P9JEW6xna.net] >>287 同じこといってるかもしれんけどこの場合変数Hanteiが丸々要らない if文の中にセルの色変更のコードを書けばいい 仮に、この変数がいるとしてもどんな値が入っててもどうせfalseにするんだからif分岐してる意味がわからない もっと言うとHanteiとかいう変数名がクソ過ぎる なんの判定かさっぱりわからん canChangeColorとかnotMatchValueとかしとけば目的が分かりやすいのに
303 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 19:09:05.50 ID:RC6w6Z/F0.net] A列の各セルの情報と合致するものが、C列に一件も無かった場合、 次に合致するデータが現れるまでA列の背景色を変え続ける という処理なのでHanteiが要らない様に書き換えるって難しい気がするんだけど。
304 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 19:13:14.77 ID:P9JEW6xna.net] >>295 ごめん、そこちゃんと読み込めてなかったわ 一致したら変えると勘違いした なんにしてもフラグの初期化は頭かケツでいいと思うけど
305 名前:デフォルトの名無しさん [2017/12/01(金) 19:49:15.65 ID:4uYh51s/0.net] ちなみにこのコードはVBAエキスパート公式のだよ
306 名前:デフォルトの名無しさん [2017/12/01(金) 20:08:56.93 ID:4uYh51s/0.net] 似たようなソースコードを作ってみました なぜだかエラーがでます Sub test() Dim i As Long Dim j As Long Dim U As Long For i = 1 To Cells(Rows.Count, 1).End(xUp).Row For j = 1 To Cells(Rows.Count, 3).End(xUp).Row If Cells(i, 1) = Cells(j, 3) Then U = 1 End If Next j If U = 1 Then U = 0 Else Cells(j, 3).ColorIndex = 3 End If Next i End Sub
307 名前:デフォルトの名無しさん mailto:sage [2017/12/01(金) 22:17:56.90 ID:eRljVU/z0.net] xUp → xlUp
308 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 00:44:57.80 ID:aL/u+cy30.net] >>295 確かに一致したものが無かったらだからBoolean使う方が自然か。 使わなくても簡単だけど自然なBoolean使うのが正しいわ。 俺も勘違いした。 ちなみに、一致せずに全てチェックしてjのループを終了した場合のjの値を調べればBooleanはいらんし、そもそもFind使ってループ1つにしてもいらん。 この仕様を見た場合、絶対こんなコード書かないけど、俺が書くとした場合の配列にぶちこむ方法はBoolean使うのが自然だな。 ちなみにランダムで10000行にデータ入れた場合、このコードで320秒、Find使う方法で22秒、配列入れる方法で9秒だった。
309 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 01:37:25.51 ID:jpak6rxd0.net] 小学生がなんで3×5が15になるの?って聞いてるのに 俺なら電卓で答えだすぜ!って息巻いてる人のようにみえる 学習の初段階でつまずいてる人への的確な回答ではないわな
310 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 05:02:50.84 ID:EvURnJTn0.net] なんつうか、これが俺の後輩なら、フローチャート書いてみって言いたくなるな もうフローチャートなんて10年以上見てないけどな >1なぜ変数を初期化するのか? あってもなくてもこのコードなら動くけど すべての言語が変数を初期化してくれるわけではないので、変数は必ず自分で初期化しろって作法もある 自分で初期化すれば、初期値を間違えて覚えていたりしてもバグになりにくいしな(Booleanの初期値はFalse) >2なぜNextjでjだけループが終わるのか? ちょっと質問の真意がわからん ForとNextは1対1で対応するんで、Next jならjのループ終端だぞ >3If Hantei Then (もしも変数の場合は。。。) もはや意味がわからない IfとThenの間に書くのは、条件式と呼ばれる式(文じゃないよ) 式の値がTrueかFlaseで条件分岐する そして変数はそれだけで式として成り立つ。この場合は変数の内容そのものが式の値 If Hantei=True Thenって書いても良いんだけど、(とくにBooleanに対する=Trueは)冗長だと言って嫌う作法もある VBAはExcelが現役だから、いつまでたっても入門者が一定数いるよなぁ はっきり言えば、今どきのブログラムの勉強にはVBAは向かないよ
311 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:17:12.76 ID:/lrBlva0M.net] ブック名 C:\book.xlsx シート名 データ 説明文パート 1〜5行目 データパート ..ヘッダ A6〜Z6 ..データ A7〜Z* ..データ件数 不定 プロバイダ Microsoft.ACE.OleDB.12.0 このような設定でヘッダとデータをselect文で全件取得するにはどうすればいいですか?
312 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:26:37.96 ID:aL/u+cy30.net] >>301-302 超初心者の話かよ。 VBAエキスパートの話じゃなかったんか? あと、If Hantei Thenを分からないって言ってるのは感覚の話で、君の説明じゃ分からないと思うぜ。 Hantei=Trueという式自体に値があって、それが正しい場合にその値は(Hantei=True)=Trueという結果になっているということが感覚的に分からないと理解できんだろ。 初心者はHanteiとTrueが等しかった場合と感覚的に理解してるんだから。 その感覚ではIf Hantei Thenが理解出来ない。
313 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:27:57.05 ID:cPyK88Sm0.net] >>303 SQLで任意のセル範囲を取得する場合はFROM文で取得出来たはず。 SELECT * FROM [ データ$A6:Z1000] みたいな形。 ただその条件だとデータベースに投げる前にエクセル上で整形した方が効率いいと思うけど。
314 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 08:31:27.69 ID:7+Ics+9V0.net] if hentai = true then 変態は正義
315 名前:デフォルトの名無しさん [2017/12/02(土) 09:32:03.18 ID:1C3LInkCp.net] まず>>287 のプログラムを動作順に日本語訳してくれよ
316 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:12:44.97 ID:aL/u+cy30.net] >>307 簡単だろ。 A列のそれぞれのセルに対してC列に同じ値が無かったら色を付けてる。 1.A2からA列の最終セルまで1つ1つのセル(以下Aiとする)について以下を繰り返す。 2.C2からC列の最終セルまでにAiと同じ値が有ったときHanteiをTrueに設定。 3.HanteiがFalseの場合(C列にAiと等しい値はなかった場合)はAiに色を付ける。 4.HanteiがTrueの場合はFalseに設定。(どんな場合だろうがFalseに設定したいが、既にFalseなのにFalseに設定する必要は無い。単にFalseに初期化してるだけ。) 5.Aiの次のセルに対して繰り返し処理続行する。
317 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:17:14.58 ID:tnWofmmQ0.net] >>304 「VBAエキスパート」という資格の勉強をしている超初心者の話だろ? VBA始めて3日と書いてるし
318 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:45:34.19 ID:cPyK88Sm0.net] エキスパート名乗ってる割にはバグくさいコードなんだよな。 If Not Hantei Then Cells(i, 1).Interior.ColorIndex = 6 Hantei = False っていう書き方がたぶん本来意図した仕様に近いと思うんだけども。
319 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 11:46:30.49 ID:ab3YxIeg0.net] Hantei が Hentai に見える
320 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:09:12.13 ID:aL/u+cy30.net] >>309 勉強してる奴が質問してるんであって、 このコードはそいつが書いたもんじゃない。 VBAエキスパート公式ってんだから、 資格の参考書かなんかに載ってるんだろ。 >>310 いや、この書き方自体は良くあるよ。 あんたのも間違いじゃない。
321 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:24:58.47 ID:fk+w59AEa.net] ○○でもわかる ○○のすべて ○○エキスパート ○○完全ガイド こういうタイトル付いてるのは初心者向け
322 名前:デフォルトの名無しさん mailto:sage [2017/12/02(土) 14:38:18.30 ID:zmHPgLHa0.net] >>312 だから初心者用の本に載ってるコードが分からないと言ってるんだからこその>>301 のツッコミなわけだろ? 本に載ってるコードの評価をしてくれという質問ではない
323 名前:デフォルトの名無しさん [2017/12/03(日) 08:02:30.09 ID:Q2bt/ZXPa.net] エクセル相談所にあった質問で、とりあえずVBAなしじゃ出来ないって言っといったんだけど、VBAでリストの絞り込みって一度で出来る? 多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって事だと思うんですけど。 インターネットの選択方式でそんなの見た事あるけど一から開発するの面倒くさそう。 ユーザーフォームと2次元配列でも使えばできるかな? ちなみにこの機能の名称あれば教えて欲しいです。 自分も配列すら参考書でかじったくらいでその必要性がわかってない初心者です
324 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 08:42:40.14 ID:U0ESQ6dD0.net] 残念ながらVBAなしで実現可能
325 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 09:19:50.58 ID:lwbJHU3ya.net] お力添えをお願いします チェックボックスでチェック入れたら行の高さを0にし、チェック入れなかったら13.5にしたいのですがうまく動作してくれません Sub チェック8_Click() Dim A As Boolean Dim B As Boolean If A = True Then A = Rows(43).RowHeight = 13.5 B = Rows(44).RowHeight = 13.5 Else A = Rows(43).RowHeight = 0 B = Rows(44).RowHeight = 0 End If End Sub どこが間違っているのかご教示お願いします。
326 名前:デフォルトの名無しさん [2017/12/03(日) 09:52:22.12 ID:ObUuqjZI0.net] >>317 行は適当に変えてくれ Private Sub CheckBox1_Click() If CheckBox1.Value Then Rows(3).RowHeight = 13.5 Rows(4).RowHeight = 13.5 Else Rows(3).RowHeight = 0 Rows(4).RowHeight = 0 End If End Sub
327 名前:デフォルトの名無しさん [2017/12/03(日) 10:04:41.09 ID:ObUuqjZI0.net] >>317 フォームコントロールならこっちだわ コントロール名は適当に変えてくれ Sub チェック2_Click() If Sheet1.CheckBoxes("チェック 2").Value = 1 Then 'これでダメなら下を試そう 'If "Sheet1".Shapes("チェック 2").ControlFormat.Value = 1 Then Rows(3).RowHeight = 13.5 Rows(4).RowHeight = 13.5 Else Rows(3).RowHeight = 0 Rows(4).RowHeight = 0 End If End Sub
328 名前:デフォルトの名無しさん [2017/12/03(日) 10:11:57.07 ID:lwbJHU3ya.net] >>319 ありがとうございます!!!こちらで動作しました!!本当に有難うございます!!!
329 名前:デフォルトの名無しさん [2017/12/03(日) 10:42:36.13 ID:HLUSF6su0.net] 〉〉314 できるの? 入力規則の絞り込みじゃないよ? 階層化してリストから直接下層に移動(3段階くらい)して選択する方法だよ? <
330 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 11:18:12.75 ID:U0ESQ6dD0.net] おいおい急に条件増やすなよw www.tschoolbank.com/excel/validation-list-linkage/ こういうことじゃないのかよ
331 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 11:24:14.71 ID:pXIsIngK0.net] >>322 これの話だから知らないなら絡んでくるなよ mevius.2ch.net/test/read.cgi/bsoft/1506938295/713
332 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 11:39:56.54 ID:JkBkmVnb0.net] >>314 違う。 そのコード書いた奴に向かって言ってるのと、躓いてる奴にはそのコードはよろしくないと言ってる。 何の例かは分からんが、もっと現実的なコードにすべきなんだぜ。
333 名前:デフォルトの名無しさん [2017/12/03(日) 12:12:17.46 ID:HLUSF6su0.net] >>322 しかも、わかりにくいかもしれないけど条件ちゃんと書いてあるんだけどね 入力規則の絞り込み検索じゃない。 階層ごとにクリック選択する事すらめんどくさいと言ってるんだよ。 一度の選択でリストの階層移動ができるかどうかを質問主は相談所で聞いていて 自分はVBAないとだめだよと回答したけどVBAだとどうなんだろうとこっち で聞きなおしてみたんだけど、
334 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 12:58:31.51 ID:A600L+iiM.net] >>325 さすがにそれは読み取れん
335 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 13:12:35.66 ID:bN8T4SKTM.net] >>323 こういう糞レスがつくからスレが過疎るんだぞ
336 名前:デフォルトの名無しさん [2017/12/03(日) 13:54:27.80 ID:HLUSF6su0.net] ちゃんと、VBAでリストの絞り込みって一度で出来る? こう書いて その下に 多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって こう書いてあるんだけど読み取れない? しかも、前文にエクセル相談所にあった質問こうも書いてあるし。 で、わざわざVBAで聞いてるのにわからないかー
337 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 15:23:42.34 ID:icSWQcwl0.net] 具体的なコードが伴わない場合は外野がなんかゴチャゴチャ言っている程度に聞き流すべき。 >>323 の質問はウィンドウズ標準のメニューバーみたいな形を想定しているみたいなので、 外部参照にMicrosoft Toolbarとかあれば、それを追加して解決するんじゃないかな。
338 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 15:57:02.43 ID:pXIsIngK0.net] >>328 > 多分第1候補のリストを出したままその右には第2のリスト候補が表示されそれを第3候補までマウスの操作だけで選択させようって マウス操作にはクリックも含むのが普通だと思うぞ >>327 無駄なレスしてなにか楽しいのか? >>329 あっちのスレ読めばわかるけどそもそも VBA 使わずにできるかどうかの問題になってるから Toolbar 云々の話ですらない お前さんこそ聞き流すべき
339 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 16:12:49.11 ID:icSWQcwl0.net] >>330 どちらかというと>>315 の質問に答えた形だけど。 向こうの質問にこっちで答える義理もないし。
340 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 17:11:02.86 ID:JkBkmVnb0.net] >>315 それは、VBAでも出来ないと思う。 というかWindowsの標準動作と違う。 似たようなのは出来るかもしれないけど。 コンボボックスじゃなくメニューなら出来るかな。 見ためが違うけど。 見ためをコンボボックスにしたいならコンボボックス使わずにフォ−ムに描画した方が楽じゃね? コンボボックスだと選択しないとイベント発生させるのが難しいし、イベント発生時にブルダウンが閉じるのが通常動作だから。 サブクラスでHITTEST検出で出来るかどうか。 VBAではウルトラC級に難しい。
341 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 17:13:47.51 ID:JkBkmVnb0.net] >>329 メニューバーの見ためは駄目なんじゃないの? 俺もメニューバーが現実的だとは思うけど。
342 名前:デフォルトの名無しさん mailto:sage [2017/12/03(日) 18:36:56.64 ID:RpLqv7Ag0.net] >>315 階層付きMenuで3項同時に入力するってこと? 自分だったらContextMenuの改造またはPopupでやるかな。 見た目悪いけど、最下層をデリミタ区切りのフルセットにすれば Splitして投げ込むだけでいいでしょ? CellのContextMenuだとあとで標準に戻すこと考えないと いけないので最近はもっぱらPopupばかり使ってる。 Cellのプルダウンだと表示数に限りがあるけど、Popupだと 画面サイズいっぱいまでいけるし、、 あ、もちろんCommandBarsのアレのことです。
343 名前:デフォルトの名無しさん [2017/12/03(日) 22:48:18.35 ID:DUCKYmEka.net] >>315 いえ、1つ目のリストを表示して、マウスの位置をその位置まで持ってきて 2つ目のリストを表示してって3つ目のリストを最終的に表示するみたいな。 エクセルの旧表示みたいな感じで、ファイル→検索みたいな感じです。 多分
344 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 00:43:15.26 ID:oPXdl+lm0.net] >>335 いやだからそれって、階層メニューのことでしょ? 手近なところでいうと、、、たとえばFireFoxだと、 表示 > テキストエンコーディング > 自動判別 > 日本語 みたいな。この手のMenuって、onMouseOverイベントで 下層が勝手に開いていきますよね。 それで各階層の選択肢を全部入力値として使うことじゃないの?
345 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 02:58:02.92 ID:Fxj9yJGL0.net] そう、これはメニューの動作なんだ。 コンボボックスで実現するのはとても難しい。 ほとんどの奴は上級者でも不可能と言うだろう。 それとも俺の知らない何かがあるかもしれないけど。
346 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:21:07.64 ID:oPXdl+lm0.net] コンボの配下にメニュー作ろうとすると怒られた。 階層メニューによる一括入力、自分でも使うかもと思い作ってみたよ。 1) 前提:質問者のリンク先キャプチャを参考 A2:C2が回答入力欄 キャプチャにある凡例を登録するための矩形範囲を"R_Master"とする。 2)呼出部:キャプチャのA1セルにある "商品"の文字列を右クリックで発動。 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Target.Resize(1, 1).Value = "商品" Then Cancel = True Call Popup_FullPut(Range("R_Master"), " 個") End If End Sub
347 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:23:18.02 ID:oPXdl+lm0.net] 3)Menu生成部 Sub Popup_FullPut(rngMst As Range, Optional strUnit As String) Dim r As Range Dim i As Long, j As Long, k As Long With CommandBars.Add(Position:=msoBarPopup) For i = 0 To rngMst.Rows.Count - 1 Set r = rngMst.Offset(0, 0).Resize(1, 1).Offset(i, 0) If r.Value = "" Then Exit For With .Controls.Add(msoControlPopup) .Caption = r.Value For j = 0 To rngMst.Rows.Count - 1 Set r = rngMst.Offset(0, 1).Resize(1, 1).Offset(j, 0) If r.Value = "" Then Exit For With .Controls.Add(msoControlPopup) .Caption = r.Value For k = 0 To rngMst.Rows.Count - 1 Set r = rngMst.Offset(0, 2).Resize(1, 1).Offset(k, 0) If r.Value = "" Then Exit For With .Controls.Add(msoControlButton) .Caption = r.Value & strUnit .OnAction = MkAction( "Popup_Input", rngMst.Address(external:=True),i & "|" & j & "|" & k ) End With Next End With Next End With Next .ShowPopup .Delete End With End Sub
348 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:24:02.05 ID:oPXdl+lm0.net] 4)入力実行部 Sub Popup_Input(strMst As String, strAns As String) Dim rngR1 As Range: Set rngR1 = Range("A2") Dim rngR2 As Range: Set rngR2 = Range("B2") Dim rngR3 As Range: Set rngR3 = Range("C2") Dim rngMst As Range: Set rngMst = Range(strMst) Dim i As Long, j As Long, k As Long i = Split(strAns, "|")(0) j = Split(strAns, "|")(1) k = Split(strAns, "|")(2) rngR1.Value = rngMst(i + 1, 1).Value rngR2.Value = rngMst(j + 1, 2).Value rngR3.Value = rngMst(k + 1, 3).Value End Sub
349 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:28:37.65 ID:oPXdl+lm0.net] 5)引数付きのOnActionコマンドの生成に普段使っている関数 ん?書き込めない、、なんで? 要は文字列生成がメンドーだから関数使ってるだけなんだけど、、
350 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:36:14.51 ID:oPXdl+lm0.net] 刻んでみる。 5)引数付きのOnActionコマンドの生成に普段使っている関数 Function MkAction( strCMD
351 名前: As String, Optional arg1 As String, Optional arg2 As String ) [] [ここ壊れてます]
352 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:41:24.99 ID:oPXdl+lm0.net] Dim文のところではじかれるみたい、、 5)引数付きのOnActionコマンドの生成に普段使っている関数 Function MkAction( strCMD As String, Optional arg1 As String, Optional arg2 As String ) Dim DQ As String: DQ = Chr(34) Dim SQ As String: SQ = Chr(39) Dim buf As String buf = strCMD & " " If arg1 <> "" Then buf = buf & DQ & arg1 & DQ If arg2 <> "" Then buf = buf & "," & DQ & arg2 & DQ MkAction = SQ & buf & SQ End Function 書き込めたかな? Chr関数は禁則?
353 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 03:44:57.18 ID:oPXdl+lm0.net] 書き込めた。 Chr関数で引っかかっていたみたい。実際は半角です。 インデントは全角スペースになっているので変換が必要です。
354 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 07:27:39.63 ID:65GoxPZl0.net] VBEにコピペすると、全角スペースは自動的に半角スペースに変換されるから意識する必要ない
355 名前:デフォルトの名無しさん mailto:sage [2017/12/04(月) 07:55:50.52 ID:oPXdl+lm0.net] >>345 本当ですね。 tnx!