[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『For To Next 処理とコード記述の整理』(あらくま)
[[20100108084000]]『連続転記の効率化』でお世話になった”あらくま”です。 てつろうさん、ichinoseさん、Mookさん、ご近所PGさんの助言をもとに、いろ いろと調査、検討した結果、シートで条件付き書式の設定が複雑、多量?であ ることが原因ではないかと結論づけました。(本当のところ正解ではないかも 知れません) そこで、マクロで該当部分のみ、書式(セル背景色、文字色)を設定すること にしました。 初心者の小生ですので、書籍等を頼りに、下記のシート構成で1行分を対象とし た、コードを作成することができました。 しかし、このあと、対象行を変化させながら、処理するコードがどうしても作成 できません。変数を設け、For To Next で処理すればよいのではと考えますが、 Sheet2の行変化は、変数をnとして、For n=3 To 12 で考えられますが、それと 連動するSheet1のH行の変化をどう扱えばよいか、思いつきません。 また、現在のコード記述ももっとすっきりできないかとも思います。 どなたか、併せてご教示願えませんでしょうか。
Sheet1 Sheet2 H A B C D E F G 7 △ 1 8 △ 2 日 曜 行事1 行事2 行事3 係 食事 9 3 1 木 10 4 2 金 11 ○ 5 3 土 12 ○ 6 4 日 13 7 5 月 14 8 6 火 15 ○ 9 7 水 16 ○ 10 8 木 17 11 9 金 18 12 10 土 19 ○ 13 11 日 20 14 12 月 21 15 13 火 22 ○ 16 14 水
Sub Test1() Dim X, Z As Variant X = Worksheets("Sheet2").Range("B3").Value Z = Worksheets("Sheet1").Range("H7").Value If Z = "" Then 'Hセルが空白のとき Worksheets("Sheet2").Range("A3:G3").Interior.ColorIndex = 40 '40は肌色 Worksheets("Sheet2").Range("A3:C3").Font.ColorIndex = 3 ElseIf Z = "△" Then 'Hセルが△のとき Worksheets("Sheet2").Range("A3:G3").Interior.ColorIndex = 34 '34は薄水色 Worksheets("Sheet2").Range("A3:C3").Font.ColorIndex = 7 '7は濃い桜色 ElseIf Z = "○" And X = "土" Or X = "日" Then 'Hセルが○で、Bセルが土又は日のとき Worksheets("Sheet2").Range("A3:G3").Interior.ColorIndex = -4142 Worksheets("Sheet2").Range("A3:C3").Font.ColorIndex = 5 '5は青 Else Worksheets("Sheet2").Range("A3:G3").Interior.ColorIndex = -4142 '-4142は塗りつぶしなし xlNoneでもよし Worksheets("Sheet2").Range("A3:C3").Font.ColorIndex = 0 '0は黒 End If End Sub [Excel2003,WindowsXP]
変数nに+4という事ですか? よく分かってないのですが・・・ (bbq)
bbqさん、早速ありがとうございました。 なんだ、単純なこと、何で気づかなかったのだろうか、と恥ずかしくなります。 For n = 3 To 16 X = Worksheets("Sheet2").Cells(n, 2).Value Z = Worksheets("Sheet1").Cells(n + 4, 8).Value ****************************** Next n として Worksheets("Sheet2").Range(Cells(n, 1), Cells(n, 7)).Interior.ColorIndex = ● Worksheets("Sheet2").Range(Cells(n, 1), Cells(n, 3)).Font.ColorIndex = ● と関連部分を変更して実行したところ、うまくいきました。 動作はしたのですが、何か、コード記述がうるさいようで、もっとすっきりとした記述は ないものでしょうか。 たとえば、Worksheets("Sheet2").Range(Cells(n, 1), Cells(n, 7))の部分が繰り返し出 てきますが、ここを整理できないものでしょうか。 (あらくま)
Worksheets("Sheet2").Cells(n, 1).Resize(, 7).Interior.ColorIndex = ● の方がよいでしょう。
>Worksheets("Sheet2").Range(Cells(n, 1), Cells(n, 7)).Interior.ColorIndex = ● でうまくいったのは、たまたまです。(Sheet2がActiveだったから)
Worksheets("Sheet2").Range(Worksheets("Sheet2").Cells(n, 1), Worksheets("Sheet2").Cells(n, 7)).Interior.ColorIndex = ● のように、CellsのParent objectを明示的に指定する必要があります。 (seiya)
seiyaさん、ありがとうございました! 確かに、小生のものではSheet2がActiveでないとエラーですね。 Worksheets("Sheet2").Range(Worksheets("Sheet2").Cells(n, 1), Worksheets("Sheet2").Cells(n, 7)).Interior.ColorIndex = ● では大変です。 Resizeについて勉強します。 (まとな)
(まとな)さん=(あらくま)さん?
> Worksheets("Sheet2").Range(Worksheets("Sheet2").Cells(n, 1), Worksheets("Sheet2").Cells(n, 7)).Interior.ColorIndex = ● > では大変です。
そのためには、 With Worksheets("Sheet2") .Range(.Cells(n, 1), .Cells(n, 7)).Interior.ColorIndex = ● End With という書き方もできます。
また
Dim WS2 As Worksheet Set WS2 = Worksheets("Sheet2") WS2.Range(WS2.Cells(n, 1), WS2.Cells(n, 7)).Interior.ColorIndex = ●
や
Dim WS2 As Worksheet Set WS2 = Worksheets("Sheet2") With WS2 .Range(.Cells(n, 1), .Cells(n, 7)).Interior.ColorIndex = ● End With
という書き方もできます。 最初示されたコードを見て気になったのですが、この書き方をしますと、 Worksheets("Sheet2") を何度も書く必要がありませんので、修正等も楽になると思います。
(とおりすがり)
話とは関係有りませんが、前のスレも完結させて頂けませんか? 過去ログは、後に同じ問題に当たった人を解決に導く手助けに成ります。
(HANA)
とおりすがりさん、ありがとうございました! 以前、使用していたネームを使ってしまいました。 前記書き込みの「まとな」は「あらくま」です。 >Dim WS2 As Worksheet >Set WS2 = Worksheets("Sheet2") >With WS2 > .Range(.Cells(n, 1), .Cells(n, 7)).Interior.ColorIndex = ● >End With 大変、参考になります。 シート名等に変更があったときのことを考えると、是非使いたいと思います。 変数をうまく利用すると修正も楽なように思えます。 Withも今後使っていきたいと思います。 これから、所用で席を離れますので、修正、試行は後ほどになると思います。 分からないことや困ったことが出たときには、再度、質問いたします。 そのときは、ご援助、お願いいたします。
To HANAさん、いつも、お助けいただき、ありがとうございます。 >話とは関係有りませんが、前のスレも完結させて頂けませんか? >過去ログは、後に同じ問題に当たった人を解決に導く手助けに成ります。 どうしたらよろしいのでしょうか。ご指導、いただければ幸いです。 本質問の冒頭で書かせていただきましたように、明確なことは分からないのですが、 シートの構成に問題があったように考えています。 特に、ご近所PGさんが教えてくださった以下が大いに参考になりました。
(あらくま)
とおりすがりさん、報告が遅くなりました。 希望した通りの動作です。問題なく(今のところ)動作しています。 下記のとおり、コード記述もすっきりしました。 本当にありがとうございました。
Sub Test4()
Dim X, Z As Variant Dim n As Integer Dim WS1, WS2 As Worksheet
Set WS1 = Worksheets("Sheet1") Set WS2 = Worksheets("Sheet2")
For n = 3 To 16
X = WS2.Cells(n, 2).Value Z = WS1.Cells(n + 4, 8).Value
If Z = "" Then With WS2 .Cells(n, 1).Resize(, 7).Interior.ColorIndex = 40 .Cells(n3, 1).Resize(, 7).Font.ColorIndex = 3 End With ElseIf Z = "△" Then With WS2 .Cells(n, 1).Resize(, 7).Interior.ColorIndex = 34 .Cells(n, 1).Resize(, 7).Font.ColorIndex = 7 End With ElseIf Z = "○" And X = "土" Or X = "日" Then With WS2 .Cells(n, 1).Resize(, 7).Interior.ColorIndex = -4142 .Cells(n, 1).Resize(, 7).Font.ColorIndex = 5 End With Else With WS2 .Cells(n, 1).Resize(, 7).Interior.ColorIndex = -4142 .Cells(n, 1).Resize(, 7).Font.ColorIndex = 0 End With End If Next n
End Sub (あらくま)
> コード記述もすっきりしました
Dim WS1, WS2 As Worksheet は、 Dim WS1 As Worksheet, WS2 As Worksheet としたほうがいいと思います。
(とおりすがり)
とおりすがりさん、最後の最後までありがとうございます。 ご助言を大切にします。 (あらくま)
蛇足だけど...
With WS2.Cells(n, 1).Resize(, 7) .Interior.ColorIndex = 40 .Font.ColorIndex = 3 End With
のようにすれば、直接範囲を参照します。 (seiya)
> .Cells(n3, 1).Resize(, 7).Font.ColorIndex = 3
は、
.Cells(n, 1).Resize(, 7).Font.ColorIndex = 3
の間違いでしょうか? 間違いでないならば、変数の宣言はしておいたほうがいいと思います。
(とおりすがり)
コードの方に関しては セルの書式を変更するのは、全てWS2に関しての様ですから その都度上下を挟んで書くのではなく 全体で一つにしても良いのではないかと思います。
例えば、 With WS2 For n = 3 To 16 : : Next n End With
また、seiyaさんが書いて居られますが .Cells(n, 1).Resize(, 7)までが共通ですから With WS2.Cells(n, 1).Resize(, 7) If Z = "" Then : : End If End With
の位置でも良いかもしれません。
>>話とは関係有りませんが、前のスレも完結させて頂けませんか? > どうしたらよろしいのでしょうか。 に関して少し書かせて頂きます。
同じ問題を抱えて過去ログを検索して、前スレを見つけた人は あらくまさんがどの様に推測してどの様に解決したのか 現在のままでは分かりません。
どのタイミングでスレを分けるのがよいのかは 色々な判断が有るとは思いますが 「続いている」と考えるなら新規で質問をするのではなく 続きに書いていただいておくのが良いのでは無いかと思います。 実際に前のスレとかなり密接に関係していると思います。
新たにする場合でも、その段階でどの様な結論をだし どの様な解決手段をとることにしたのか 書いておいて頂いた上で こちらへのリンクをはっておいていただければ そのスレを単独で見た人はその書き込みはとても参考になると思います。 又、これから先話が進み、当時の結論が間違っていたと分かった場合は 新しい結論を書いておいて頂けると より良いと思います。
あらくまさんがこのスレで書いて居られる >特に、ご近所PGさんが教えてくださった以下が大いに参考になりました。 と言うコメントは、前スレを参考にしてる人にとっても ・・・寧ろ、前スレを参考にする人にこそ・・・ このあらくまさんのコメント自体が、参考になると思います。
現在のご自身の問題を解決するだけではなく 同じ問題を抱えている人に 「ココを見て色々試してみたら?自分があんな感じで解決したよ」 と言えるような過去ログに成るように心がけていただければ良いと思います。
それから、コメントをもらったら、そのスレ内でお礼(応答)を 書いておかれるのが良いと思います。 別のスレで書いてあってもそのスレを見るかどうか分かりませんし 回答者は自分の関係したスレを気を付けてチェックすると思います。 時間が無い場合は特に。 また、前スレだけを見た人に「聞きっぱなしかよ」と受け止められかねません。
(HANA)
とおりすがりさん、ご指摘のとおり、間違いです。 nのところをn3としてしまいました。 seiyaさん、HANAさん、さらにすっきりとした記述へのアドバイス ありがとうございました。試してみたいと思いますし、今後大いに 使わせてもらいます。 また、HANAさんには、スレに対する姿勢についてご助言をいただき、 感謝申し上げます。 私自身、過去ログ検索をしながら、問題解決の手がかりを得て、助 かることが多いところです。利用者がお互いに益を得ることのでき る場であることは本当に大切だと感じます。 HANAさんの言葉を大切に、今後もお邪魔したいと思います。 HANAさん、皆さん、よろしくお願いいたします・ 出かけていたため、確認が遅くなりました。 (あらくま)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.