同じシート内であるセルとあるセルを同期するには
セルを参照します。
例えば、A1セルをB1セルと同期させるには
A1セルに次のように入力します。
=B1
別のシートのB1セルを参照するには
='シート名'!B1
のように、シングルクォーテーションではさんだシート名の後に
「!」を付けてセルのアドレスを続けます。
同じシート内のセルを参照しても
異なるシートのセルを参照しても
参照先のセルが空白だと「0」が表示されてしまいます。
次の画像は、セルA1に「=B1」と入力した場合、
セルB1が空白なのでセルA1は「0」になっています。
必要のない「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も空白
セルB1が空白でないときの画像
最初に説明したように、
別のシート(シート名を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列に
「初詣」と入力すると
月間カレンダーの方もこうなります。
アプリケーション風味が少ししてきました。
コメント
Sub macro100324a()とSub macro100326a()で
コンパイルエラー
Sub または Function が定義されていません
SheetAddDel (MyYear & "年" & MyMonth & "月")
ここのところです.
解決方法をよろしく
投稿: きんめい | 2010年5月13日 (木) 15時42分
「SheetAddDel」は
引数ありの自作プロシージャですので、
記事「シート挿入あれこれ」で該当プロシージャを
標準モジュールにコピペしてから実行してください。
記事は「SheetAddDel」でGoogle検索して
見つけてください。
他にもブログ内で既出のマクロ/コードは
断りなく使用しますので、
検索して該当記事を探してください。
記事数が増えるとリンクを貼るのが大変ですので
以後、ご了承くださ~い。
また、感想などコメントいただけるとウレシイデス。
投稿: 管理人やむえむ | 2010年5月13日 (木) 23時23分