[表示 : 全て 最新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)


216 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 12:05:42.58 ID:h1FhSyIp0.net]
>>209
素早いご回答ありがとうございます。
修正してみましたが、今度は絞込みあり/なし何れも1行だけになりました

何だか難しい操作ですねえ…

217 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 12:12:04.66 ID:h1FhSyIp0.net]
Dim MaxRow As Long
MaxRow = ws.Range("A" & Rows.Count).End(xlUp).row

これを追加して、
Set rgFilter = ws.Range("A1:A" & MaxRow).CurrentRegion.SpecialCells(xlCellTypeVisible)

にしてみても、結果は>>208と同じになりました。
んー謎です

218 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 13:34:47.29 ID:bxAooAvMa.net]
>>205
あるにはあるけどクソめんどくさいぞ
すべてのセルの初期値保持しといて、閉じるときに確認して値に変更なければsavedをtrueにしてから閉じる、とかね

219 名前:デフォルトの名無しさん [2017/11/24(金) 16:52:13.42 ID:x6NJ51zce.net]
Sheets("Sheet1").Columns(2).Insert Shift:=xlToLeft
Sheets("Sheet1").Columns(2).Insert Shift:=xlToRight

この二行の動作の差が分からないので
違いを教えてください

220 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:34:32.78 ID:HKDmIDHRH.net]
>>213
現在のcolumns(2)の中身が左にずれるか、そのままか、かな?
当てずっぽうだけど。

221 名前:デフォルトの名無しさん [2017/11/24(金) 19:18:42.44 ID:V+PY16OM0.net]
>>206
>>212
アドインをあきらめます。
ありがとうございました。

222 名前:デフォルトの名無しさん [2017/11/25(土) 12:49:09.41 ID:roqaXNhOa.net]
エクセルVBAですがあるシートで入力し別のシートに転記するというコードを記入しているのですが
For文でやろうとするとうまくいきません。元々のシートの行が11行目から始まり転記先のシートが2行目から始まるのでネストを使って以下のようにコードを組んでみたのですが2行目の入力データが転記先のデータに2行追加されてしまいました。
1行目と2行目はそれぞれ別のデータが記述されておりそのまま転記できるようなコードにしたいです。
もしかしたら、そもそもforだとだめなのかもしれません。ちなみに入力するデータが11行目から始まり終わりは20行目で終わります。
がとりあえず繰り返し構文でできればかまいません。下記のコードをどう変えればいいか教えてください。
Sub 登録()
Set syougai = Sheets("障害記録") 'シート名にて指定しているので変更しない事
Set itigi = Sheets("一時データ") 'シート名にて指定しているので変更しない事
Const hiduke As Long = 19 '日付列の定数
Const gouki As Long = 17 '号機の列の定数
Const era As Long = 18 'エラーコードの列の定数
Const hyou1 As Long = 11 '障害集計表上の定数
Const kisyu As Long = 21
Const syuukei1 As Long = 21
For i = 2 To 3
For j = 11 To 12
itigi.Cells(i, 1).Value = syougai.Cells(j, hiduke).Value '日付
itigi.Cells(i, 2).Value = syougai.Cells(j, gouki).Value '号機
itigi.Cells(i, 3).Value = syougai.Cells(j, kisyu).Value '機種
itigi.Cells(i, 4).Value = syougai.Cells(j, era).Value 'エラーコード
itigi.Cells(i, 5).Value = syougai.Cells(j, syuukei1).Value '集計データ
i = i + 1
j = j + 1
Next j
Next i
End Sub

223 名前:デフォルトの名無しさん [2017/11/25(土) 13:36:20.17 ID:fp6T8Ewd0.net]
〉〉214
ネストの使い方間違ってると思うのですがどう直せばいいのかわかりません。

224 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 13:39:02.15 ID:Sg1k8TV00.net]
>>216
itigi じゃなくて itiji にしろ
シート名「にて」はやめてシート名「で」にしろ
i = i + 1 と j = j + 1 は不要なので消せ



225 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 13:55:20.06 ID:QhU2UVSF0.net]
>>216
単純にシートで開始行がずれているだけなら

For i = 2 to 3
itigi.Cells(i, 1).Value = syougai.Cells(i +9, hiduke).Value
以下略
Next

でいいんじゃないでしょうか
ループはネストすると
内側のループだけ全部回して外に抜ける、を外のループの回数
だから、ネストでは意図した動作にならないでしょう
>>218も言っているけど、Nextで変数に勝手に+1されるから足さなくていい

226 名前:デフォルトの名無しさん [2017/11/25(土) 14:08:02.51 ID:fp6T8Ewd0.net]
ありがとうございました。
できました。

227 名前:デフォルトの名無しさん [2017/11/25(土) 15:25:06.65 ID:P/RTUJJid.net]
てか hiduke なんて変数名使うくらいなら「日付」のほうが10倍まし

228 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:03:29.39 ID:dlgn0p0Vx.net]
そもそもVBAでやることなのかな
転記先の一時データのシートのセルに障害記録シートのセルを参照する式を書くだけで良くない?

229 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:17:31.37 ID:4suMRhlB0.net]
変数名ぐらい自由にしてやれw

230 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:23:34.66 ID:Yv0FOuti0.net]
>>216
値を取得しながら転記しようとするから混乱する
コレクションなり配列なりに一回格納してから転記するようにすればネスト要らん

231 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:30:52.78 ID:Yv0FOuti0.net]
>>223
変数名は大事でしょ
こいつの変数の付け方は最悪に近いわ
代入の式見なかったらなんのことだかわからねー

232 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:32:47.09 ID:+Jz8ZPqE0.net]
本人できたって言ってるのにグダグダ言う奴ウザイわ

233 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:35:56.02 ID:ISZ6M3sb0.net]
hidukeと日付のどちらか選べと言われたら、hidikeを選ぶ。

234 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:37:28.74 ID:S5e4mFeJd.net]
仕事内容を記録するエクセルを作成したく、
シート名は各個人名でフォームを開くボタン設置。
登録用に必要項目をフォームで作り、転記するサンプルマクロを書いたんですが、今後必要項目が増えたり、減ったりしたときに人数分フォームを弄ったりマクロ書き換えるのは面倒ななんですけど、一個をものを共有し使用するにはどうしたらいいですか?

各個人のエクセルを開き、作ったボタンで共通のエクセルを開きフォームを開いて転記させるとか?

共通のエクセルを読み取り専用で開き書き込む時に自分のエクセルを開いて転記させるとか?

なんかうまいやり方ないですか?



235 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 17:42:32.82 ID:Sg1k8TV00.net]
>>227
何が言いたいんだW

236 名前:デフォルトの名無しさん [2017/11/25(土) 17:52:49.62 ID:M1jU9gED0.net]
>>228
シート毎つまり人毎にボタンを作るなら
そのボタンをクリックした時にその人独自の値をグローバル変数とかに代入して
フォームは共通のものを呼び出す

フォームに入力されたものを書き込む時は
さっきのグローバル変数を見て
書き込み先のシートとかを特定する

237 名前:デフォルトの名無しさん [2017/11/25(土) 17:53:40.22 ID:M1jU9gED0.net]
>>230
同時に複数の人がそのエクセルファイルを使わない事が前提だけど

238 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:31:33.42 ID:S5e4mFeJd.net]
>>231
同時に開くことがあるんですよ。

239 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:33:58.83 ID:MqKvnHus0.net]
>>228
一つのエクセルファイルを複数人で同時に使うのはいろいろ大変だと思う。
共有共通にせず個人毎に違うファイルを使ってもらって、
仕事内容記録フォルダに入ってるファイル全てをまとめて集計するマクロを作った方がよさそ。

240 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:34:51.02 ID:Sg1k8TV00.net]
>>232
データはなんでもいいからDBに書き込んでエクセルはインプット画面として割り切りなさい
マジで

241 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 18:38:42.16 ID:Yv0FOuti0.net]
エクセルの共有はマジで地雷
運用を見直した方がいい

242 名前:デフォルトの名無しさん [2017/11/25(土) 19:34:05.10 ID:PrfYax++p.net]
>>232
入力するのが一人で他の人が見るだけなら問題ない

複数人が同時に書き込むならエクセルじゃなくて
ウェブアプリとかにした方が良いと思う

243 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 19:37:11.17 ID:T5+qbkCf0.net]
mdbを複数ユーザーで同時に掴めるなら、SQLでデータを投げれば動作するんじゃないの。
入力フォーム作りがクソ面倒くさいからエクセルでやるのは愚策中の愚策なのは確かだけど。

244 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 19:44:15.61 ID:4suMRhlB0.net]
>>225
健康のためなら死ねるタイプ?w
ごめんけど理解不能



245 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 19:46:52.39 ID:4suMRhlB0.net]
どうしてもエクセルだけでやりたいなら、フォームとデータでファイル別けるべきだね

246 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:15:23.25 ID:Yv0FOuti0.net]
>>238
いや、常識だろ
自分でメンテするにしたって嫌だわ

247 名前:デフォルトの名無しさん [2017/11/25(土) 20:24:47.32 ID:fZkth5mu0.net]
フォームボタンをクリックした時に
グローバル変数とかに時刻なり、その人のIDなりを記録して
編集中である事が分かるようにしておく

書き込んだら

248 名前:Nリアする

他の人がフォームボタンをクリックしたら
編集中かどうかチェックして
編集中なら後で再実行するようにダイアログを出す
[]
[ここ壊れてます]

249 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:38:06.48 ID:4suMRhlB0.net]
>>240
お前の常識とか知らんし興味もない。
他人の変数名にケチ付けるのは常識じゃなくてエゴだろ

250 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:40:07.39 ID:99QBz+fh0.net]
React では、データアクセス(CRUD)部分は、
Flux の、Store という部分で、 UI とは完全に分離させている

nmp の、immutable パッケージで、データを変更不能にしたり

251 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 20:41:41.46 ID:4suMRhlB0.net]
日本語でおk

252 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 21:19:48.45 ID:d0mIe/tRa.net]
変数名は結構考えるけどな。
普段なら辞書サイトでその意味の英単語から付けることが多い。
API使えば変数名の重要性が分かる。

253 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 21:53:57.63 ID:Sg1k8TV00.net]
>>245
それは変数名と言うより引数名でしょ?
それだったら確かに大事

254 名前:デフォルトの名無しさん mailto:sage [2017/11/25(土) 22:00:33.02 ID:T5+qbkCf0.net]
個人的に引数含む変数名に半角英字は避けるように徹底してる。
予約語と被らなくなるし徹底すれば読みやすいしね。

一般的に、名前に半角英数使うのはコンパイラが2バイト文字対応していない事が理由なんで、
対応しているコンパイラには積極的に2バイト文字で投げた方がいい。



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の次のセルに対して繰り返し処理続行する。






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

前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