• ベストアンサー

マクロのコーディング

すいません、下のコード(マクロなんですが)同じ処理を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

質問者が選んだベストアンサー

  • ベストアンサー
  • yanmaa
  • ベストアンサー率45% (207/457)
回答No.1

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

jiri
質問者

お礼

他の仕事と平行してまして、返事送れました。 ごめんなさい。昨日やったところ、結果、思った通りに動きました。 ありがとうございます。 ところで、for loop文はno.2のdandeさんがおっしゃるように、 ここでいう、変数iをloop文中の処理に使用しなくていいんでしょうか?

その他の回答 (4)

  • akasaka
  • ベストアンサー率38% (38/99)
回答No.5

補足ありがとうございました。 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)
回答No.4

 しかし、これ動くんですか? 最初の If Range("K39:L39").Select <> "" Then は、ELSE条件が考えられません。 更に次の行では If .Cells(43, 5).Value = "" Then と、ドットセルズになっているため、参照方法が間違っている感じがします。 単純にループ処理にしないで、標準モジュール内に Function 関数名(変数名 As Range) As String … End Function 等として、レンジの値を取得して動作が可能なユーザー定義関数を作ってしまった方がスマートかもしれませんね。 昨日の晩、回答してみましたが、今朝方気になりましたもので… 失礼しました。

jiri
質問者

お礼

すいません、返事遅れまして。 >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)
回答No.3

 なんとなく、あなたがやりたいことが判りました。  ただ、セルの指定にアルファベットが出てきてしまうので、単純にループさせる方法に戸惑っているだけですね。  ならば、一つのセルを指定し、そのセルの絶対座標を数字で取得する方法はどうでしょうか?   x = Sheets("シート名").Range("H39").Column  '横座標の取得   y = Sheets("シート名").Range("H39").Row    '縦座標の取得  これで、例えば「H39」と言うセルの縦と横の座標が数字で取得できます。  あとはこの絶対座標を基準として、加算減算をすればループ処理に持っていくことは容易いと思います。

  • dande
  • ベストアンサー率28% (4/14)
回答No.2

同じ処理を繰り返すには、幾つか方法がありますので、基本的な方法を書いておきます。 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を立ち上げてヘルプを読めば他にも参考資料があります。

jiri
質問者

お礼

返事をくれました。すいません。 構文は知っているのですが、実際、ちょっと、複雑になると、 さっぱりです。慣れだといわれますが....。

関連するQ&A