つらつら Excel VBA

私の備忘録です。

簡潔に書こうとして失敗した

こんなの書いた。範囲拡大するだけ。

Sub test1()
    
    Dim rng As Range
    Set rng = Range("A1")
    
    With rng
        Set rng = .Resize(, 2) '列数拡大(1→2)
        Set rng = .Resize(3) '行数拡大(1→3)
    End With
    
    Debug.Print rng.Address
    
End Sub

.Resize(, 2)で列数が2に変わったことは確認した。
しかし「$A$1:$A$3」が出力される。「$A$1:$B$3」じゃない。

With内で書き換えたから参照先がおかしくなった?
Resizeの行数を省略したから?

そもそも普通に書いても短く済むのに可読性悪くなってる。
結論。デバッグ重要。

以上。

範囲を広げる(Offset、Resize)

上下左右1セルずつ選択範囲を広げたい。
1セル選択→9セル選択、4セル選択→16(18)セル選択みたいな感じのことをしたい。

起点が1列目1行目の場合にOffsetでエラーが起きる。
これを無視すると簡単。

Sub 選択範囲を広げる1()
    
    On Error Resume Next
    
    Dim targetRange As Range
    
    With Selection
        Set targetRange = .Offset(-1, -1).Resize(.Rows.Count + 2, .Columns.Count + 2)
    End With
    
    targetRange.Select
    
End Sub


上記Offset時のエラー回避版。

Sub 選択範囲を広げる2()
    
    Dim targetRange As Range
    Set targetRange = Selection '.Areas(1)
    
    Dim iRowAdd As Integer: iRowAdd = 1
    Dim iColumnAdd As Integer: iColumnAdd = 1
    
    If targetRange(1).Row > 1 Then
        Set targetRange = targetRange.Offset(-1, 0)
        iRowAdd = 2
    End If
    If targetRange(1).Column > 1 Then
        Set targetRange = targetRange.Offset(0, -1)
        iColumnAdd = 2
    End If
    
    With targetRange
        Set targetRange = .Resize(.Rows.Count + iRowAdd, .Columns.Count + iColumnAdd)
    End With
    
    targetRange.Select
    
End Sub

以上。

罫線を引く、消す、有無を比較

罫線について使うプログラムと定数をまとめた。

'選択範囲に格子の線を引く
Selection.Borders.LineStyle = xlContinuous ’実線
Selection.Borders.LineStyle = True '同じ結果
' 選択範囲に中太、青色、格子線
' 線の指定をせずとも罫線が出る不思議。
With Selection.Borders
    .Weight = xlMedium '中
    .Color = vbBlue '青色
End With
'下辺に実線
Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous
'選択範囲の外周に線を引く
Selection.BorderAround LineStyle:=xlContinuous ', Weight:=xlThick, Color:=vbRed
'選択範囲の罫線を消す。以下全部同じ結果。
Selection.Borders.LineStyle = xlLineStyleNone
Selection.Borders.LineStyle = xlNone
Selection.Borders.LineStyle = False


罫線の有無が混在する複数セルに対して実施するとNullが返るため、比較は慎重に行う。

' A1について下線の有無を比較
If Range("A1").Borders(xlEdgeBottom).LineStyle = xlLineStyleNone Then
    Debug.Print "罫線無い"
Else
    Debug.Print "罫線ある!"
End If

'選択範囲の罫線が格子であるか比較
With Selection.Borders
    If IsNull(.LineStyle) Then
        Debug.Print "罫線が混在"
    Else
        If .LineStyle = xlLineStyleNone Then
            Debug.Print "罫線無い"
        Else
            Debug.Print "罫線ある!"
        End If
    End If
End With


線の種類

定数内容
xlContinuous実線(細)1
xlDash破線-4115
xlDashDot一点鎖線4
xlDashDotDot二点鎖線5
xlDot点線-4118
xlDouble二重線-4119
xlSlantDashDot斜め斜線13
xlLineStyleNone無し-4142


線の太さ

定数内容
xlHairline極細線1
xlThin細線2
xlMedium中太線-4138
xlThick太線4


線の場所。未指定で格子。

定数内容
xlDiagonalDown右下がり斜め線5
xlDiagonalUp右上がり斜め線6
xlEdgeLeft左辺7
xlEdgeTop上辺8
xlEdgeBottom下辺9
xlEdgeRight右辺10
xlInsideVertical内側の垂直線11
xlInsideHorizontal内側の水平線12

以上。

プロシージャが大きすぎます

プログラムが大きいとエラー。64Kを超えるとダメとのこと。


8,000行くらい書いて実行したら上記のエラーが出ました。

Sub test()
    
    Dim iYear As Integer, iMonth As Integer, iDay As Integer
    Dim sMsg As String
    
    'テストデータ
    iYear = 2023
    iMonth = 2
    iDay = 30
    
    If iYear = 2022 And iMonth = 1 And iDay = 1 Then
        sMsg = "2022年1月1日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 2 Then
        sMsg = "2022年1月2日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 3 Then
        sMsg = "2022年1月3日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 4 Then
        sMsg = "2022年1月4日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 5 Then
        sMsg = "2022年1月5日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 6 Then
        sMsg = "2022年1月6日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 7 Then
        sMsg = "2022年1月7日"
    ElseIf iYear = 2022 And iMonth = 1 And iDay = 8 Then
        sMsg = "2022年1月8日"
    
    '~略~
    
    ElseIf iYear = 2032 And iMonth = 12 And iDay = 30 Then
        sMsg = "2032年12月30日"
    ElseIf iYear = 2032 And iMonth = 12 And iDay = 31 Then
        sMsg = "2032年12月31日"
    Else
        sMsg = "日付が不正です"
    End If
    
    Debug.Print sMsg
    
End Sub


コンパイルエラーが起きなくなるまでIF文の分岐を下から削除。
このラインでエラーが出なくなり、約3,500行残った。削除せずにコメントアウトでもOK。

ダメなポイント
・3,500行も書いて日付範囲が5年弱。
・別プロシージャを追加すれば日付範囲が広げられる?
・プロシージャの64K制限をどうにかすれば・・・
・改修の作業量が尋常じゃない。
・違う。そうじゃない。





上記プログラムを出力したプログラムも載せときます。

'新規シートに出力される。VBEにコピペしてインデント揃える。
Sub プログラムを出力するプログラム()
    
    Dim iYear As Integer, iMonth As Integer, iDay As Integer
    Dim sMsg As String
    
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets.Add
    
    Dim iRow As Long: iRow = 1
    
    For iYear = Year(Now()) To Year(Now()) + 10
        For iMonth = 1 To 12
            For iDay = 1 To 31
                
                '月またぎ判定。うるう年対応。
                If Not IsDate(iYear & "/" & iMonth & "/" & iDay) Then Exit For
                
                sh.Range("A" & iRow).Value = "elseif iYear = " & iYear & " and iMonth = " & iMonth & " and iDay = " & iDay & " then"
                sh.Range("B" & iRow + 1).Value = "sMsg = """ & iYear & "年" & iMonth & "月" & iDay & "日"""
                
                iRow = iRow + 2
                
            Next
        Next
    Next
    sh.Range("A" & iRow).Value = "end if"
    sh.Range("A1").Value = Replace(sh.Range("A1").Value, "elseif", "if") '最初のelseifを修正
    
    Set sh = Nothing
    
End Sub


以上。

CSSで行間調整

<p class="div-sample" style="line-height: 100%;">
.div-sample {
    width: 270px;
    margin-right: auto;
    background-color: #FFFFCC;
}

line-height
行間調整用プロパティ。文字サイズ+行間の数値を指定する。
推奨値1.5以上。1.5と150%は同じ指定。px、emでも指定可能。
指定サイズ-文字サイズで余った分が上下均等に割り振られる。


以下、どんな感じになるのかテスト。


未指定

あいうえおかきくけこさしすせそ
たちつてとなにぬねのはひふへほ
まみむめもやらりるれろゆよわをん


200%

あいうえおかきくけこさしすせそ
たちつてとなにぬねのはひふへほ
まみむめもやらりるれろゆよわをん


150%

あいうえおかきくけこさしすせそ
たちつてとなにぬねのはひふへほ
まみむめもやらりるれろゆよわをん


100%

あいうえおかきくけこさしすせそ
たちつてとなにぬねのはひふへほ
まみむめもやらりるれろゆよわをん


50%

あいうえおかきくけこさしすせそ
たちつてとなにぬねのはひふへほ
まみむめもやらりるれろゆよわをん


0%

あいうえおかきくけこさしすせそ
たちつてとなにぬねのはひふへほ
まみむめもやらりるれろゆよわをん


以上。

CSSでテーブルストライプ模様

はてなブログ内のテーブルをしましま模様にしたい。
WindowsAndroidGoogleChromeでは出来た!他は知らん(R4/4/27)

.sample001 th, .sample001 td {
	border: 1px solid #000000;
}
.sample001 tr:nth-child(odd) td {
	background: #c0c0c0;
}
.sample001 tr:hover td {
	background: #00ff00;
}

以下の表にタッチ、マウスオーバーしてテスト。

TH1TH2
テスト1テスト2
ここだけ
style
テスト3テスト4
テスト5テスト6

nth-child(odd)で奇数行、nth-child(even)で偶数行、ついでにマウスオーバー時の背景色変更もできた。

style="background~での指定は強い。cssで指定しているストライプもマウスオーバー処理も変化無し。

以上。

CSSよく分からん

困っているわけではないのです。

こんなテーブルを用意。

タイトル1 タイトル2 タイトル3
a b c
d e f
g h i
j k l
m n o
p q r
s t u
v w  
x y z

自分のはてぶ環境はWindows10のGoogleChrome

tableを行単位で塗り潰したい。とりま交互に塗り潰してみた。

 

<tr style="background-color:#66CCFF;">と書いた部分が塗れてない。はてなブログ内でCSSの優先順位があるのかな・・・CSSはよく分からんです。<tr style=じゃなくて<td style=で全部指定すると塗れる模様。

 

見たまま編集時のキャプチャ。こんな風に塗れる予定だったが・・・

 

実際こんな塗り方なんて絶対しないし、全く困ってない。

AndroidChromeで確認したら塗れててワロタ。でもth部分は塗れてない。ブラウザによるのか!?

 

何度も言うが困っていない。こういう場合に困るのは上司や顧客から指摘された時だけなのだ。

 

以上。