- ベストアンサー
マクロのコーディング
すいません、下のコード(マクロなんですが)同じ処理を4回も繰り返しているので、(入りきらないので、2回にしました)ひとつにまとめたいです。どうすればいいでしょうか?教えて下さい。 '●業務番号チェック 'エラー時は青 If Range("H39:I39").Select <> "" Then If .Cells(43, 5).Value = "" Then Total_Check_Flg = True '色付の範囲の設定 Range("A43:B43").Select 'セルの色の設定(青) With Selection.Interior .ColorIndex = 41 End With Err_Kazu_4 = Err_Kazu_4 + 1 End If End If If Range("K39:L39").Select <> "" Then If .Cells(44, 5).Value = "" Then Total_Check_Flg = True '色付の範囲の設定 Range("A44:B44").Select 'セルの色の設定(青) With Selection.Interior .ColorIndex = 41 End With Err_Kazu_4 = Err_Kazu_4 + 1 End If
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
4回繰り返すので簡単にFor文を使いました。 後はHと言う文字の数値で表した値をAsc文でとってChr文で文字に戻しています。 なお動作確認もしていないので間違ってたらすみません。 a = Asc("H") b = 43 For i = 1 to 4 If Range(chr(a) & "39:" & chr(a+1) & "39").Select <> "" Then If .Cells(b, 5).Value = "" Then Total_Check_Flg = True '色付の範囲の設定 Range("A" & CStr(b) & ":B" & CStr(B)).Select 'セルの色の設定(青) With Selection.Interior .ColorIndex = 41 End With Err_Kazu_4 = Err_Kazu_4 + 1 End If End If a = a + 3 b = b + 1 Next
その他の回答 (4)
- akasaka
- ベストアンサー率38% (38/99)
補足ありがとうございました。 If Range("H39:I39").Select <> "" Then この条件が必ず「真」になってしまうので「偽」であるセルのクリアができないのですね。 ちょっと美しくないですが、ばらしてみました。 If Range("H39").Value <> "" And Range("I39").Value <> "" Then 個別にセル内をチェックすることにより、H39,I39をクリアすると「偽」の答えが返ってきますので、ELSE条件で カラーインデックス=2 などで白色にすると青色はめでたく消えてくれます。 If Range("H39").Value <> "" And Range("I39").Value <> "" Then If Cells(43, 5).Value = "" Then Total_Check_Flg = True Range("A43:B43").Select '色付の範囲の設定 With Selection.Interior 'セルの色の設定(青) .ColorIndex = 41 End With Err_Kazu_4 = Err_Kazu_4 + 1 End If Else With Selection.Interior 'セルの色の設定(白) .ColorIndex = 2 End With End If
- akasaka
- ベストアンサー率38% (38/99)
しかし、これ動くんですか? 最初の If Range("K39:L39").Select <> "" Then は、ELSE条件が考えられません。 更に次の行では If .Cells(43, 5).Value = "" Then と、ドットセルズになっているため、参照方法が間違っている感じがします。 単純にループ処理にしないで、標準モジュール内に Function 関数名(変数名 As Range) As String … End Function 等として、レンジの値を取得して動作が可能なユーザー定義関数を作ってしまった方がスマートかもしれませんね。 昨日の晩、回答してみましたが、今朝方気になりましたもので… 失礼しました。
お礼
すいません、返事遅れまして。 >If Range("K39:L39").Select <> "" Then >は、ELSE条件が考えられません。 else条件はどうすればいいんですかね? if文はelse条件をつけたほうがいいということですか? それとも、else条件自体がこの場合ありえないということですか? たしかに、ちょっと、不具合がありまして、 エラー(Range("H39:I39").Selectが入力済でRange("A43:B43")を空欄。)で、Range("A43:B43").Selectが色付けされたあと、 Range("H39:I39").Selectを空欄にしても、 エラーの色付けが消えないんですよ。 そこんとこの理解がたりないいんですかね。 >If .Cells(43, 5).Value = "" Then >と、ドットセルズになっているため、参照方法が間違っている感じがします。 これに関しては、 With Worksheets("WorkReport")をコードの上で書いているんで 問題ありません。(スペース上、端折りました。)
- akasaka
- ベストアンサー率38% (38/99)
なんとなく、あなたがやりたいことが判りました。 ただ、セルの指定にアルファベットが出てきてしまうので、単純にループさせる方法に戸惑っているだけですね。 ならば、一つのセルを指定し、そのセルの絶対座標を数字で取得する方法はどうでしょうか? x = Sheets("シート名").Range("H39").Column '横座標の取得 y = Sheets("シート名").Range("H39").Row '縦座標の取得 これで、例えば「H39」と言うセルの縦と横の座標が数字で取得できます。 あとはこの絶対座標を基準として、加算減算をすればループ処理に持っていくことは容易いと思います。
- dande
- ベストアンサー率28% (4/14)
同じ処理を繰り返すには、幾つか方法がありますので、基本的な方法を書いておきます。 1.nがmになるまで繰り返す For n=0 To m 処理文(ここでnを使う) Next n 2.***の条件になるまで繰り返す Do 処理文 Loop Until *** 例えば If Range("B" & Selection.Row) = "" Then _ Cells(Selection.Row + 1, Selection.Column).Select Call ReDrow Loop Until Selection.Row > 128 Or Range("B" & Selection.Row) <> "" のような感じです。 VBを立ち上げてヘルプを読めば他にも参考資料があります。
お礼
返事をくれました。すいません。 構文は知っているのですが、実際、ちょっと、複雑になると、 さっぱりです。慣れだといわれますが....。
お礼
他の仕事と平行してまして、返事送れました。 ごめんなさい。昨日やったところ、結果、思った通りに動きました。 ありがとうございます。 ところで、for loop文はno.2のdandeさんがおっしゃるように、 ここでいう、変数iをloop文中の処理に使用しなくていいんでしょうか?