« 月間カレンダー、祝日あり | トップページ | LineStyleの見本 »

2010年3月26日 (金)

別のシートのセルと同期する

同じシート内であるセルとあるセルを同期するには
セルを参照します。
例えば、A1セルをB1セルと同期させるには
A1セルに次のように入力します。

=B1

別のシートのB1セルを参照するには

='シート名'!B1

のように、シングルクォーテーションではさんだシート名の後に
「!」を付けてセルのアドレスを続けます。

同じシート内のセルを参照しても
異なるシートのセルを参照しても
参照先のセルが空白だと「0」が表示されてしまいます。

次の画像は、セルA1に「=B1」と入力した場合、
セルB1が空白なのでセルA1は「0」になっています。
Vba20100326a

必要のない「0」が表示されると見にくいので
これをなくします。

ワークシート関数を使って解決します。

手順は、まず参照先のセルが空白かどうかかを判定します。
参照先のセルが空白なら参照元のセルも空白に、
空白でないのなら参照先セルをそのまま参照します。

空白かどうかの判定は、
ISBLANK関数を使います。
簡単な使用例を示します。

セルA1が空白のとき、
ISBLANK(A1)の値はTRUEです。

ISBLANK(A1) = TRUE

これを論理関数IFの条件判断の部分に使います。

IFの使い方は、

IF(論理式, 真の場合, 偽の場合)

で、個人的に分かりやすくすると

IF(条件, TRUEの場合の値, FALSEの場合の値)

です。
さて、材料が揃ったのでまとめます。

セルA1でセルB1を参照して
セルB1が空白ならセルA1も空白に、
セルB1が空白でないのならその値をセルA1の表示する
セルA1の数式です。

=IF(ISBLANK(B1), "", B1)

これをセルA1に入力したときの画像
セルB1が空白のときA1も空白
Vba20100326b

セルB1が空白でないときの画像
Vba20100326c

最初に説明したように、
別のシート(シート名をSheet2とする)のB1でこの数式を使うには

=IF(ISBLANK('Sheet2'!B1), "", 'Sheet2'!B1)

のようにします。

これを何に使うかというと
記事「月間カレンダー、祝日あり 」で作った
月間カレンダーの日付けのセルと
その元となった年間カレンダーのセルと同期させて
祝日だけでなく
個人的なスケジュールも組み込むのに使います。

月間カレンダーの方は1日で5行1列分を使っています。
最初の1行は日付けと祝日で
残りの4行分が自由にできます。

この4行分が年間カレンダーの同じ日付けの行の
C列からF列に対応します。

上記記事内のコードmacro100324aを
改造したコードはこちら

月間カレンダー、祝日あり2を作るコード:

Sub macro100326a()
'月間カレンダー、祝日あり2
'1シートひと月

    Dim i, j, k As Integer
    Dim MyYear, MyMonth As Integer
    MyYear = 2010
    MyMonth = 0
    Dim SheetA, SheetB As Object
    Set SheetA = Sheets(MyYear & "年カレンダー")
    Dim MyRange As Range
    Dim StrWeekDay As Variant
    StrWeekDay = Array("月", "火", "水", "木", "金", "土", "日")
    Dim EndRow, MRow, MCol As Integer
    EndRow = SheetA.Range("A1").End(xlDown).Row
   
    For i = 2 To EndRow
        '月が替わったらシートを挿入
        If MyMonth <> Month(SheetA.Cells(i, 1)) Then
            MyMonth = Month(SheetA.Cells(i, 1))
            SheetAddDel (MyYear & "年" & MyMonth & "月")
            Set SheetB = Sheets(MyYear & "年" & MyMonth & "月")
            
            'なんとなくページ設定
            'まだよくわかってないけど
            With SheetB.PageSetup
                .PrintArea = "$A$1:$G$37"
                .Zoom = False
                .CenterHorizontally = True
                .PaperSize = xlPaperA4
                .FitToPagesTall = 1
                .FitToPagesWide = 1
            End With

            SheetB.Cells(1, 1) = MyMonth & "月"
            SheetB.Cells(1, 1).Font.Size = 24
            
            SheetB.Cells(1, 7) = MyYear & "年"
            SheetB.Cells(1, 7).Font.Size = 16
            
            For j = 1 To 7
                '曜日の文字を入れる
                Cells(2, j) = StrWeekDay(j - 1)
               
                '日ごとの枠を設定、6週分(固定)
                For k = 3 To 3 + 5 * 6 Step 5
                    Set MyRange = Range(toA1("R" & k & "C" & j & ":R" & k + 4 & "C" & j))
                    With MyRange.Borders(xlEdgeLeft)
                        .LineStyle = xlContinuous
                        .Weight = xlThin
                        .ColorIndex = xlAutomatic
                    End With
                    With MyRange.Borders(xlEdgeTop)
                        .LineStyle = xlContinuous
                        .Weight = xlThin
                        .ColorIndex = xlAutomatic
                    End With
                    With MyRange.Borders(xlEdgeBottom)
                        .LineStyle = xlContinuous
                        .Weight = xlThin
                        .ColorIndex = xlAutomatic
                    End With
                    With MyRange.Borders(xlEdgeRight)
                        .LineStyle = xlContinuous
                        .Weight = xlThin
                        .ColorIndex = xlAutomatic
                    End With
                Next k
            Next j
            
            '曜日の文字を中央、そのほかを左揃えなど
            Range("A2:G2").HorizontalAlignment = xlCenter
            Range("A2:G2").RowHeight = 25
            With Range("A3:G37")
                .HorizontalAlignment = xlLeft
                .VerticalAlignment = xlBottom
                .ColumnWidth = 11.25
            End With
            
            MRow = 3
        End If

        '曜日を判定して列を決める
        If Weekday(SheetA.Cells(i, 1)) = 1 Then
            MCol = 7
        Else
            MCol = Weekday(SheetA.Cells(i, 1)) - 1
        End If
       
        '年間カレンダーの日付けと祝日をSheetBのセルに入れる
        SheetB.Cells(MRow, MCol) = _
            Day(SheetA.Cells(i, 1)) & " " & SheetA.Cells(i, 2)
               
'追加部分開始
        '年間カレンダーと月間カレンダーを同期する数式を入力
        For j = 1 To 4
            SheetB.Cells(MRow + j, MCol).Formula = _
                "=IF(ISBLANK('" & MyYear & "年カレンダー'!" & toA1("R" & i & "C" & j + 2) & _
                    "), " & Chr(34) & Chr(34) & ", '" & MyYear & "年カレンダー'!" & toA1("R" & i & "C" & j + 2) & ")"
        Next j
'追加部分終了

        '日付け文字スタイル
        With SheetB.Cells(MRow, MCol).Characters _
            (start:=1, Length:=Len(Day(SheetA.Cells(i, 1)))).Font
            .Name = "MS Pゴシック"
            .FontStyle = "標準"
            .Size = 17
            .ColorIndex = xlAutomatic
        End With
        '祝日の文字スタイル
        With SheetB.Cells(MRow, MCol).Characters _
            (start:=Len(Day(SheetA.Cells(i, 1))) + 2, _
            Length:=Len(SheetA.Cells(i, 2))).Font
            .Name = "MS Pゴシック"
            .FontStyle = "標準"
            .Size = 11
            .Subscript = True '下付き文字
            .ColorIndex = xlAutomatic
        End With
        'セルの塗りつぶし
        SheetB.Range(toA1("R" & MRow & "C" & MCol & ":R" & MRow + 4 & "C" & MCol)). _
            Interior.Color = SheetA.Cells(i, 1).Interior.Color
        If Weekday(SheetA.Cells(i + 1, 1)) = 2 Then
            MRow = MRow + 5
        End If
    Next i
End Sub

例えば、年間カレンダーの1月1日の行のC列に
「初詣」と入力すると
Vba20100326d

月間カレンダーの方もこうなります。
Vba20100326e

アプリケーション風味が少ししてきました。

|

« 月間カレンダー、祝日あり | トップページ | LineStyleの見本 »

コメント

Sub macro100324a()とSub macro100326a()で

コンパイルエラー 
Sub または Function が定義されていません

SheetAddDel (MyYear & "年" & MyMonth & "月")
ここのところです.
解決方法をよろしく

投稿: きんめい | 2010年5月13日 (木) 15時42分

「SheetAddDel」は
引数ありの自作プロシージャですので、
記事「シート挿入あれこれ」で該当プロシージャを
標準モジュールにコピペしてから実行してください。

記事は「SheetAddDel」でGoogle検索して
見つけてください。

他にもブログ内で既出のマクロ/コードは
断りなく使用しますので、
検索して該当記事を探してください。

記事数が増えるとリンクを貼るのが大変ですので
以後、ご了承くださ~い。

また、感想などコメントいただけるとウレシイデス。

投稿: 管理人やむえむ | 2010年5月13日 (木) 23時23分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 別のシートのセルと同期する:

« 月間カレンダー、祝日あり | トップページ | LineStyleの見本 »