Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3177 / 13644 ツリー ←次へ | 前へ→

【63629】If〜thenの条件式について ぼこ 09/11/23(月) 2:02 質問[未読]
【63630】Re:If〜thenの条件式について MI 09/11/23(月) 6:54 発言[未読]
【63678】Re:If〜thenの条件式について ぼこ 09/11/29(日) 15:11 質問[未読]
【63680】Re:If〜thenの条件式について kanabun 09/11/29(日) 16:11 発言[未読]
【63681】Re:If〜thenの条件式について kanabun 09/11/29(日) 16:22 発言[未読]
【63682】Re:If〜thenの条件式について kanabun 09/11/29(日) 16:54 発言[未読]
【63683】Re:If〜thenの条件式について ぼこ 09/11/29(日) 20:05 お礼[未読]
【63695】Re:If〜thenの条件式について kanabun 09/11/30(月) 21:31 発言[未読]
【63735】Re:If〜thenの条件式について ぼこ 09/12/5(土) 23:58 質問[未読]
【63736】Re:If〜thenの条件式について kanabun 09/12/6(日) 0:21 発言[未読]
【63737】Re:If〜thenの条件式について ぼこ 09/12/6(日) 13:29 お礼[未読]
【63631】Re:If〜thenの条件式について ホーキング 09/11/23(月) 13:22 回答[未読]
【63684】Re:If〜thenの条件式について ぼこ 09/11/29(日) 20:11 お礼[未読]

【63629】If〜thenの条件式について
質問  ぼこ  - 09/11/23(月) 2:02 -

引用なし
パスワード
   A1="0" かつ B1="0" ならば,
B1セルの色は何もなし。
それ以外は,
B1セルの色を赤くする。

sub test()

If Range("A1") = "0" And Range("B1") = "0" Then
Range("B1").Select
  With Selection.Interior
    .ColorIndex = xlNone
  End With
Else
Range("B1").Select
  With Selection.Interior
    .ColorIndex = 3
    .Pattern = xlSolid
  End With
End If
End sub

これを次に,
A2="0" かつ B2="0" ならば,
B2セルの色は何もなし。
それ以外は,
B2セルの色を赤くする。

といったように,データのある最終行まで同様の処理を行いたい
のですが,どのように記述したらよいでしょうか?

【63630】Re:If〜thenの条件式について
発言  MI  - 09/11/23(月) 6:54 -

引用なし
パスワード
   ▼ぼこ さん:
こんにちは、こんな方法があると思います。
データのある最終行LastRは取得出来ているものとして
For i=1 To LastR
 If Range("A" & i) = "0" And Range("B" & i) = "0" Then
    ・
    ・
    ・
 End If
Next i

>A1="0" かつ B1="0" ならば,
>B1セルの色は何もなし。
>それ以外は,
>B1セルの色を赤くする。
>
>sub test()
>
>If Range("A1") = "0" And Range("B1") = "0" Then
>Range("B1").Select
>  With Selection.Interior
>    .ColorIndex = xlNone
>  End With
>Else
>Range("B1").Select
>  With Selection.Interior
>    .ColorIndex = 3
>    .Pattern = xlSolid
>  End With
>End If
>End sub
>
>これを次に,
>A2="0" かつ B2="0" ならば,
>B2セルの色は何もなし。
>それ以外は,
>B2セルの色を赤くする。
>
>といったように,データのある最終行まで同様の処理を行いたい
>のですが,どのように記述したらよいでしょうか?

【63631】Re:If〜thenの条件式について
回答  ホーキング  - 09/11/23(月) 13:22 -

引用なし
パスワード
   >データのある最終行まで同様の処理を行いたい

A列のデータに途中空白がないとすれば、次のようなコードでどうでしょう。

Sub test()
  Dim i As Long
  
  i = 1
  Do
    If Cells(i, 1) = "0" And Cells(i, 2) = "0" Then
      Cells(i, 2).Interior.ColorIndex = xlNone
    Else
      Cells(i, 2).Select
      With Selection.Interior
        .ColorIndex = 3
        .Pattern = xlSolid
      End With
    End If
    i = i + 1
  Loop While (Cells(i, 1) <> "")
End Sub

【63678】Re:If〜thenの条件式について
質問  ぼこ  - 09/11/29(日) 15:11 -

引用なし
パスワード
   ▼MI さん:
ありがとうございます。

LastR=ActiveSheet.UsedRange.End(xlDown).Row '最終行を取得
とし,以下,
If Range("A" & i) = "0" And Range("B" & i) = "0" Then
  Range("B" & i).Select
       ・
       ・
       ・
で出来ました!

ただ,これですと途中に空欄がある場合は最終行をうまく取得できません。
そこで,
LastR=Range("A65536").End(xlUp) '最終行を取得
としてみたのですが,これですとうまく動作しません。

LastRのところをどのように修正すればよいでしょうか?

【63680】Re:If〜thenの条件式について
発言  kanabun  - 09/11/29(日) 16:11 -

引用なし
パスワード
   ▼ぼこ さん:

よこから失礼

> A1="0" かつ B1="0" ならば,
ということは セルのデータ型は文字列型ということで
しょうから、
数式でいうと
  IF(A1&B1="00",)
ということなので、この条件を 条件付書式の数式に
セットすれば いいということになりませんか?

> LastR = Range("A65536").End(xlUp) '最終行を取得
> としてみたのですが , これですとうまく動作しません。
どう、うまくいかなかったのでしょうね??

A列とB列の最終行が異なるばあいに大きいほうを
LastRow とするには、たとえばこんな感じで
いかがですか?

Sub Try1()
  Dim r As Range
  Dim LastRow As Long

  'A、B列の最終行を求める
  With Cells(Rows.Count, 1)
    LastRow = WorksheetFunction.Max( _
         .End(xlUp).Row, _
         .Offset(, 1).End(xlUp).Row)
  End With
  
  '範囲に条件付書式をセットする
  With Range("A1:B" & LastRow).FormatConditions
    .Delete
    .Add Type:=xlExpression, _
       Formula1:="=NOT($A1&$B1=ASC(""00""))"
    .Item(1).Interior.ColorIndex = 3
  End With
End Sub

【63681】Re:If〜thenの条件式について
発言  kanabun  - 09/11/29(日) 16:22 -

引用なし
パスワード
   ややや、すみません。↑ではうまくセットされてませんでした。
数式間違いと マクロ記録のコード化まちがい。

以下に訂正します
Sub Try1()
  Dim r As Range
  Dim LastRow As Long
  With Cells(Rows.Count, 1)
    LastRow = WorksheetFunction.Max( _
         .End(xlUp).Row, _
         .Offset(, 1).End(xlUp).Row)
  End With
  Set r = Range("A1:B" & LastRow)
  r.FormatConditions.Delete
  r.FormatConditions.Add Type:=xlExpression, _
       Formula1:="=NOT(ASC($A1)&ASC($B1)=""00"")"
  r.FormatConditions(1).Interior.ColorIndex = 3
End Sub

【63682】Re:If〜thenの条件式について
発言  kanabun  - 09/11/29(日) 16:54 -

引用なし
パスワード
   なんどもすみません m(__)m
こちらの勘違いでした

Sub Try1b()
  Dim LastRow As Long
  With Cells(Rows.Count, 1)
    LastRow = WorksheetFunction.Max( _
         .End(xlUp).Row, _
         .Offset(, 1).End(xlUp).Row)
  End With
  With Range("A1:B" & LastRow)
   .Interior.ColorIndex = xlNone  '◆追加
   With .FormatConditions
    .Delete
    .Add Type:=xlExpression, _
       Formula1:="=NOT(ASC($A1)&ASC($B1)=""00"")"
    .Item(1).Interior.ColorIndex = 6
   End With
  End With
End Sub

【63683】Re:If〜thenの条件式について
お礼  ぼこ  - 09/11/29(日) 20:05 -

引用なし
パスワード
   ▼kanabun さん:

すみません。
いろいろとありがとうございました。

> LastR = Range("A65536").End(xlUp) '最終行を取得
> としてみたのですが , これですとうまく動作しません。
>>どう、うまくいかなかったのでしょうね??
条件に合致していてもセルが赤くならなかったのですが,
私の勘違いで,別の場所のコードに問題があったようです。
申し訳ありません。

その他ご指摘いただきました考え方につきましても,
試してみます。
ご回答いただきありがとうございました。

【63684】Re:If〜thenの条件式について
お礼  ぼこ  - 09/11/29(日) 20:11 -

引用なし
パスワード
   ▼ホーキング さん:

ありがとうございます。
うまくいきました!

A列の途中に空白がある場合があるのですが,これについては,他の2名の方のご回答を参考になんとか解決できそうです。

ご回答いただきありがとうございました。

【63695】Re:If〜thenの条件式について
発言  kanabun  - 09/11/30(月) 21:31 -

引用なし
パスワード
   ▼ぼこ さん:

解決後にすみません。
実をいうと
Sub Try1b()
でも、条件にあう行が塗りつぶされませんでした。
その理由をずっと考えても分からなかったので、
他の掲示板に質問しましたところ、すぐ理由が分かりました

Sub Try1c()
  Dim LastRow As Long
  With Cells(Rows.Count, 1)
    LastRow = WorksheetFunction.Max( _
         .End(xlUp).Row, _
         .Offset(, 1).End(xlUp).Row)
  End With
  With Range("A1:B" & LastRow)
   .Interior.ColorIndex = xlNone
   .Cells(1).Select       '◆ここを追加 
   With .FormatConditions
    .Delete
    .Add Type:=xlExpression, _
       Formula1:="=NOT(ASC($A1)&ASC($B1)=""00"")"
    .Item(1).Interior.ColorIndex = 6
   End With
  End With
End Sub

マクロ記録のコードがうまく行って、Select Selectionを取り払った
コードがうまくいかなかったのは、
数式中で使っている $A1 というアドレスと 選択範囲の先頭セルが
対応するということを指定するために、[A1]をアクティブにしてやら
ないとダメだったんですね。
以上、事後談となりましたが、何かの機会に参考になれば
と思いまして投稿させていただきました
では (^^)

【63735】Re:If〜thenの条件式について
質問  ぼこ  - 09/12/5(土) 23:58 -

引用なし
パスワード
   ▼kanabun さん:
ご丁寧にありがとうございました。
kanabunさんの方法を試させていただきました。

解決といいながら,追加の質問をして大変申し訳ないのですが,
kanabunさんの方法で,条件にあう行が塗りつぶされることは
確認できました。

>A1="0" かつ B1="0" ならば,
>B1セルの色は何もなし。
>それ以外は,
>B1セルの色を赤くする。

[質問1]↑行全体ではなく,条件にあう行のかつB列のみを塗りつぶしたい
      という場合は,kanabunさんのコードをどのように修正すれば
      よいでしょうか?

 〉Dim LastRow As Long

 〉'A、B列の最終行を求める
 〉With Cells(Rows.Count, 1)
 〉  LastRow = WorksheetFunction.Max( _
 〉       .End(xlUp).Row, _
 〉       .Offset(, 1).End(xlUp).Row)
 〉End With

[質問2]↑応用して,A,B,C列の最終行(A列とB列とC列の最終行が
      異なるばあいに大きいほうをLastRow とする)を求めるとしたい
      ときはコードをどのようにすればよいでしょうか?


>▼ぼこ さん:
>
>解決後にすみません。
>実をいうと
>Sub Try1b()
>でも、条件にあう行が塗りつぶされませんでした。
>その理由をずっと考えても分からなかったので、
>他の掲示板に質問しましたところ、すぐ理由が分かりました
>
>Sub Try1c()
>  Dim LastRow As Long
>  With Cells(Rows.Count, 1)
>    LastRow = WorksheetFunction.Max( _
>         .End(xlUp).Row, _
>         .Offset(, 1).End(xlUp).Row)
>  End With
>  With Range("A1:B" & LastRow)
>   .Interior.ColorIndex = xlNone
>   .Cells(1).Select       '◆ここを追加 
>   With .FormatConditions
>    .Delete
>    .Add Type:=xlExpression, _
>       Formula1:="=NOT(ASC($A1)&ASC($B1)=""00"")"
>    .Item(1).Interior.ColorIndex = 6
>   End With
>  End With
>End Sub
>
>マクロ記録のコードがうまく行って、Select Selectionを取り払った
>コードがうまくいかなかったのは、
>数式中で使っている $A1 というアドレスと 選択範囲の先頭セルが
>対応するということを指定するために、[A1]をアクティブにしてやら
>ないとダメだったんですね。
>以上、事後談となりましたが、何かの機会に参考になれば
>と思いまして投稿させていただきました
>では (^^)

【63736】Re:If〜thenの条件式について
発言  kanabun  - 09/12/6(日) 0:21 -

引用なし
パスワード
   ▼ぼこ さん:

>[質問1]↑行全体ではなく,条件にあう行のかつB列のみを塗りつぶしたい
>      という場合は,kanabunさんのコードをどのように修正すれば
>      よいでしょうか?

B列だけに条件付書式設定を適用するようにすればよいのでは?
条件の数式は 変更なしです。

Sub Try1_BColumn() 'B列だけに条件付書式設定バージョン
  Dim LastRow As Long
  With Cells(Rows.Count, 1)
    LastRow = WorksheetFunction.Max( _
         .End(xlUp).Row, _
         .Offset(, 1).End(xlUp).Row, _
         .Offset(, 2).End(xlUp).Row _
         )
  End With
  With Range("B1:B" & LastRow)
    .Item(1).Select
    With .FormatConditions
      .Delete
      .Add Type:=xlExpression, _
         Formula1:="=ASC($A1&$B1)<>""00"""
      .Item(1).Interior.ColorIndex = 6
    End With
  End With
End Sub

>[質問2]↑応用して,A,B,C列の最終行(A列とB列とC列の最終行が
>      異なるばあいに大きいほうをLastRow とする)を求めるとしたい
>      ときはコードをどのようにすればよいでしょうか?

上のサンプルを見てください。
A列、B列およびC列のうち 最大の行番号を LastRowにセットしています。

【63737】Re:If〜thenの条件式について
お礼  ぼこ  - 09/12/6(日) 13:29 -

引用なし
パスワード
   ▼kanabun さん:

>[質問1]↑行全体ではなく,条件にあう行のかつB列のみを塗りつぶしたい
>      という場合は,kanabunさんのコードをどのように修正すれば
>      よいでしょうか?

〉〉B列だけに条件付書式設定を適用するようにすればよいのでは?
〉〉条件の数式は 変更なしです。

With Range("B1:B" & LastRow)
         ↑ここを設定してあげればよかったのですね。

>[質問2]↑応用して,A,B,C列の最終行(A列とB列とC列の最終行が
>      異なるばあいに大きいほうをLastRow とする)を求めるとしたい
>      ときはコードをどのようにすればよいでしょうか?

〉〉上のサンプルを見てください。
〉〉A列、B列およびC列のうち 最大の行番号を LastRowにセットしています。

.Offset(, 2).End(xlUp).Row)
  ↑この1行を追加してあげればよかったのですね。


すみません。単純なことでしたが,難しく考えすぎていたようです。
参考になりました。
ご丁寧にご回答いただきありがとうございました。

3177 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free