Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
日付の場合のみ太線に変更したい
投稿日時: 22/11/30 23:58:04
投稿者: kaya0727

日付と文字と空白が同じ列(A)に並んでおり、日付の場合のみ(日付の上に)太線を引きたいと考えております。
線の範囲は列A〜Oまでです。
行は月により増減しますのでとりあえず40行繰り返せば良いと考えました。
 
VBAの勉強を始めたばかりで検索と本を片手に下記のように作りましたが上手く動きません。
 
 
 Dim myrange As Range
  
    For Each myrange In Range("A5:A40")
        With myrange
        If
      IsDate(.Value) Then
          ActiveCell.Offset(0, 14) = Selection.Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlThick
           
        ElseIf
      IsNumeric(.Value) Then
           ActiveCell.Offset(0, 14) = Selection.Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlHairline
 
    Else
            ActiveCell.Offset(0, 14) = Selection.Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlHairline
              
         End If
         End With
         Next myrange
  
End Sub
 
全く分かっておらず申し訳ありませんがご教示いただけませんでしょうか。
 
よろしくお願いします。

回答
投稿日時: 22/12/01 06:30:38
投稿者: simple

例えばこうでしょうか。
 

Sub test()
    Dim r As Range

    For Each r In Range("A5:A40")
        If IsDate(r.Value) Then
            With r.Resize(1, 15).Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlThick
            End With
        ElseIf IsNumeric(r.Value) Then
            With r.Resize(1, 15).Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlHairline
            End With
        Else
            With r.Resize(1, 15).Borders(xlEdgeBottom)
                .LineStyle = xlContinuous
                .Weight = xlHairline
            End With
        End If
    Next r
End Sub

 
【メモ】
1. Withには徐々に慣れていることでよいと思います。
   ネストしてまで With を使わないといけないわけではありません。
   上記では、各セル r について、Withを使わずに書いています。
   (その分、変数名は短くしました)
   罫線のところは冗長さを避けて、Withを使ったほうがよいと思います。
 
2.
   If
      IsDate(.Value) Then
 という書き方はコンパイルエラーになるはずです。
   If ステートメントの書き方は、ヘルプに書かれているどおりの書き方を使ってください。
   (そのあたりで余り独自性は追わないほうがよいと思います。)
 
3.
  ActiveCell.Offset(0, 14) = Selection.Borders(xlEdgeBottom)  
  右辺はオブジェクトで、それを左辺に入れようとしていますが、エラーになります。
   詳細はコメントしません。(ご自分でも固い信念で書かれたものではないと思われるので。)
   上記を参考にしてください。
 
4. Offset とか、Resizeなども意味をもう一度確認されるとよいでしょう。
 
なお、ケースを3つに分けていますが、対応は2種類です。
そこが気になりましたが、途中段階と理解しました。
 
引き続き、取り組んでみて下さい。

回答
投稿日時: 22/12/01 09:18:22
投稿者: Suzu

simple さん が既に大きな部分は回答くださっていますので、気になった部分のみ。
 
3. Offset Resize について
https://www.moug.net/tech/exvba/0050057.html
https://www.moug.net/tech/exvba/0050058.html
 
 
4. ケースを3つに分けていますが、対応は2種類です。 は、
 条件分岐としては、3つに分けていますが、
 それぞれの分岐内での 動作を見ると 2種類の動作しかしていない。
  日付 の場合 と そうでない 場合 の分岐で 足りますよね と言う事です。
 
 
5. 「日付」という条件 と、
  その判定として IsDate関数が 合っているのか 念のため確認しておいてください。
 
 セルの書式を、文字列 にしたセル の値 と IsDate関数でそのセルの値を判定したとき
    値        IsDate戻り値
    12/1    True
    11/31    True
    12.1    True
    2022.11.31    False
 
  日付 の値として変換 できるのであれば、True になります。
  IsDate で足りるのあれば越した事はありませんが、
  質問者の方の意図と違う動作になる可能性もあります。
 
  今回の書式設定 であれば、NumberFormat プロパティー を 判定基準に含めれば良いですが
 
  日付 と 判定する基準 は、よく検証しましょう。
 
 
6. 行の増減 について
 最終行の求め方はいろいろありますが
  https://www.moug.net/tech/exvba/0050005.html
  https://www.moug.net/tech/exvba/0050088.html
 
 辺りが参考になるかと思います。

投稿日時: 22/12/01 23:56:46
投稿者: kaya0727

simple様
Suzu様
 
ご回答頂きありがとうございました。
希望通りに動き感動しております。
 
エラーになり困っていた部分や自分でも分からず見様見真似で書き込んだ所も、大変分かりやすく解説頂き、自分の勘違いに気づく事が出来ました。
また参考になるページも貼って頂きましたので活用して再度学んでいこうと思います。
本当に助かりました。
ありがとうございました。