プロが教える店舗&オフィスのセキュリティ対策術

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

A 回答 (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
    • good
    • 0
この回答へのお礼

他の仕事と平行してまして、返事送れました。
ごめんなさい。昨日やったところ、結果、思った通りに動きました。
ありがとうございます。

ところで、for loop文はno.2のdandeさんがおっしゃるように、
ここでいう、変数iをloop文中の処理に使用しなくていいんでしょうか?

お礼日時:2001/09/05 11:53

同じ処理を繰り返すには、幾つか方法がありますので、基本的な方法を書いておきます。



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を立ち上げてヘルプを読めば他にも参考資料があります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/09/05 11:58

 なんとなく、あなたがやりたいことが判りました。


 ただ、セルの指定にアルファベットが出てきてしまうので、単純にループさせる方法に戸惑っているだけですね。

 ならば、一つのセルを指定し、そのセルの絶対座標を数字で取得する方法はどうでしょうか?

  x = Sheets("シート名").Range("H39").Column  '横座標の取得
  y = Sheets("シート名").Range("H39").Row    '縦座標の取得

 これで、例えば「H39」と言うセルの縦と横の座標が数字で取得できます。
 あとはこの絶対座標を基準として、加算減算をすればループ処理に持っていくことは容易いと思います。
    • good
    • 0

 しかし、これ動くんですか?



最初の
If Range("K39:L39").Select <> "" Then
は、ELSE条件が考えられません。

更に次の行では
If .Cells(43, 5).Value = "" Then
と、ドットセルズになっているため、参照方法が間違っている感じがします。


単純にループ処理にしないで、標準モジュール内に
Function 関数名(変数名 As Range) As String

End Function
等として、レンジの値を取得して動作が可能なユーザー定義関数を作ってしまった方がスマートかもしれませんね。

昨日の晩、回答してみましたが、今朝方気になりましたもので…
失礼しました。
    • good
    • 0
この回答へのお礼

すいません、返事遅れまして。

>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")をコードの上で書いているんで
問題ありません。(スペース上、端折りました。)

お礼日時:2001/09/05 12:14

補足ありがとうございました。



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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!