[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 10/09 14:54 / Filesize : 339 KB / Number-of Response : 1038
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Excel VBA 質問スレ Part51



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)


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!

356 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 20:57:29.50 ID:dwGLun0F0.net]
エクセルのVBAで、サーバー上にディレクトリを作成して、そこにファイルを移動させたいのですが、
MkDIRで作成できませんでした。どうすればよいでしょうか?

357 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 21:25:35.80 ID:JPkeWfWn0.net]
>>347
FileSystemObject使えばできますよ。
サーバー側の権限は大丈夫ですか?

358 名前:デフォルトの名無しさん mailto:sage [2017/12/05(火) 21:34:50.27 ID:dwGLun0F0.net]
>>348 ありがとうございます!

dim myFSO as new filesystemobject
myFSO.CreateFolder (サーバー上のつくるディレクトリ名)でいけますか?
それともカレントドライブをサーバー上に移動すべきでしょうか?



359 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 00:43:40.01 ID:D6s1mPo40.net]
>>349
試してみたら?

360 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 11:15:00.00 ID:8dpxpCOD0.net]
質問です。
プロシージャの処理の途中でイミディエイトウィンドウをうまくクリアする方法はありますか?

361 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 11:39:53.74 ID:MQk7+ulPa.net]
あるかないかでいえば、
ないこともないアル
地道にセンドキーでキー送って
全選択してデリートしてって方法がな

362 名前:デフォルトの名無しさん [2017/12/06(水) 11:46:45.28 ID:vAzWmOhld.net]
関係ないけどブックを開くとイミディエイトウィンドウ上の変数が消滅するの困る

363 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 13:39:40.38 ID:yYTt94fN0.net]
>>352
その際はFocusをVBEに移してイミディエイトPaneをアクティブにする操作を挟むのでしょうか?

364 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 16:07:50.81 ID:ykbUk5IV0.net]
エクセルのVBAで競馬予想ソフト作っている人っていますか?

365 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 19:37:25.77 ID:sdGXOm2ja.net]
>>354
デバッグ クリア VBAで検索したら
幸せになれるかもよ

366 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 21:02:08.65 ID:H8Zs2M1B0.net]
VBAでコンボボックスのリストのみクリアってどうやってやるんですか?

367 名前:デフォルトの名無しさん mailto:sage [2017/12/06(水) 23:12:55.48 ID:ClwZMpdPa.net]
>>357
正式にやるのは多分すごく難しい。
Win32APIでコンボボックス内のリストボックスに対してどうにかするということになると思う。

しかし、単純に
strCombo=ComboBox1.Text
ComboBox1.Clear
ComboBox1.Text=strCombo
でテキストが一瞬クリアされたのは見えないから現実的な案だと思う。

368 名前:デフォルトの名無しさん [2017/12/07(木) 10:43:49.53 ID:cGZzJnMw0.net]
シートの非表示設定について
Sheets(”sheet1").Visible = False
でシート非表示設定をしたのですが元々非表示だとバグになってしまいます。
釦を押せば特定のシートのみを表示できるようにしたいんですけど表示時非表示時がランダムで
非表示時でもそのコード無視するかと思ったら非表示なのに非表示にするんじゃねぇと怒られた。



369 名前:デフォルトの名無しさん mailto:sage [2017/12/07(木) 10:55:46.75 ID:SgQPpSGG0.net]
>>359
VisibleプロパティがBooleanで状態を返すのでIfで分岐させる

If Sheets("sheet1").Visible Then
Sheets("sheet1").Visible = False
Else
Sheets("sheet1").Visible = True
End If

こうすると実行するたびに表示/非表示が切り替えられる

370 名前:デフォルトの名無しさん [2017/12/07(木) 11:24:06.29 ID:cGZzJnMw0.net]
>>35
ありがとうございます。できました。
なんとなく、if文使うのかなと思ったのですがif文が思いつかなかった。
Elseの下を消すことで、非表示時は非表示のままのする思い通りの事が出来ました。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<339KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef