Excel Tech-3 / マクロ


マクロを削除したのに警告が出る

【問題】
 マクロを自動記録で作成した後で、以下の手順でマクロを削除しました。

1.メニュー[ツール]-[マクロ]-[マクロ]
2.[マクロの保存先] ボックスの一覧で[作業中のブック]をクリック
3.[マクロ名] ボックスで、削除するマクロの名前をクリック
4.[削除]をクリック

 上書き保存してから、そのファイルを開くと「<ファイル名>はマクロを含んでいます。」というメッセージが出ます。
 どうすれば、このメッセージを出なくすることができるでしょうか?

【回答】
1.Alt+F11(メニュー[ツール]-[マクロ]-[VBE])
→VBE(Visual Basic Editor)が開く
2.プロジェクトエクスプローラ(通常、左側にあります)で[標準モジュール]をダブルクリック
3.Module1などと表示されているものの上で右クリック-Moduleの解放
4.「エクスポートしますか?」と聞いてきますが、[いいえ]をクリック
5.Alt+F4(メニュー[ファイル]-[終了してMicrosoft Excelへ戻る])
6.Ctrl+S (メニュー[ファイル]-[上書き保存])

【解説】
 上記手順3.でExcel97の場合には、右クリック-Moduleの削除になります。

 上記手順を行った後でも、ファイルを開いた時に「マクロを含んでいます」というメッセージが出る場合には、VBEを開いて、ThisWorkbookやSheet1などのコードウィンドウを開いて、なにかコードが残っていたら、これも削除します。

 また、名前定義が原因である場合もあります。
 以下のページをご覧ください。

[XL97] 特定の名前が定義されているとマクロダイアログが表示される
http://support.microsoft.com/default.aspx?scid=kb;ja;409313&Product=excelJPN

 もし、マクロを作成した覚えは無いのに「マクロを含んでいます」というメッセージが出る、という場合には、ウィルスチェックをされた方が良いと思います。




VBEのフォント

【問題】
 Alt+F11(メニュー[ツール]-[マクロ]-[VBE])でVBE(Visual Basic Editor)を開くと、プロジェクトとプロパティのウインドウの中の文字が、へんな書体になっているのですが、どうすれば直るでしょうか?
 Excel2000を使っています。

【回答】
 以下のページから修正プログラムをダウンロードし、インストールすることで直ります。

Microsoft Office 2000 Visual Basic Editor の表示の修正プログラム
http://www.microsoft.com/downloads/details.aspx?FamilyID=781FA2E1-205A-4310-9BE8-113A473F98C6&displaylang=JA

【解説】
 修正プログラム O9VBEupd.exe のファイルサイズは、848KBです。

 Officeをアップデートすることでも、表示が正しく行われるようになります。

Office のアップデート
http://office.microsoft.com/OfficeUpdate/default.aspx




「このプロジェクトのマクロは無効に設定されています。」エラー

【問題】
 これまで問題無く使っていたマクロを実行しようとしたところ、以下のエラーが出てマクロが使えなくなりました。

「このプロジェクトのマクロは無効に設定されています。マクロを有効にする方法についてはオンラインヘルプまたはホストアプリケーションのドキュメントを参照してください。」

 どうしたら、マクロを実行できるようになるでしょうか?

【回答】
1.メニュー[ツール]-[マクロ]-[セキュリティ]
2.[セキュリティレベル]タブで[中]をクリック
3.[OK]ボタンをクリック

【解説】
 セキュリティレベルが[高]に設定されていると、マクロは自動的に無効になってブックが開きます。
 上記手順で、セキュリティレベルを[中]に変更してから、ファイルを開くと「<ファイル名>はマクロを含んでいます。」というメッセージが出ますので、ここで[マクロを有効にする]ボタンをクリックすると、作成したマクロを使用できるようになります。

 詳しくは以下のページをご覧ください。

[XL2000] マクロのセキュリティ レベルが「高」に変更される
http://support.microsoft.com/default.aspx?scid=kb;ja;262876&Product=excelJPN




空白行を行削除

【問題】
 マクロで何もデータ、数式、コメントが入っていない行を削除するにはどうしたら良いでしょうか?

【回答】
Sub DeleteBlankRows()
  Application.ScreenUpdating = false
    On Error Resume Next
    With Cells
      .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = true
      .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = true
      .SpecialCells(xlCellTypeComments).EntireRow.Hidden = true
      .SpecialCells(xlCellTypeVisible).EntireRow.Delete
      .EntireRow.Hidden = False
    End With
  Application.ScreenUpdating = true
End Sub

【解説】
 上記マクロは以下のような流れになっています。

1.定数(数値、文字列など)、数式、コメントが入っているセルの行を非表示に
2.表示されている行を全て削除
3.全ての行を再表示

 上記マクロを実行するには、以下の手順です。

1.上記マクロの Sub から End Sub までを選択してCtrl+C (コピー)
2.Alt+F11(メニュー[ツール]-[マクロ]-[VBE])
→VBE(Visual Basic Editor)が開く
3.プロジェクトエクスプローラで、VBAProject(<当該ブック名>)を選択
4.メニュー[挿入]-[標準モジュール]
5.Ctrl+V (貼り付け)
6.Alt+F4(メニュー[ファイル]-[終了してMicrosoft Excelへ戻る])
7.Alt+F8(メニュー[ツール]-[マクロ]-[マクロ])
8.実行したいマクロ名(この場合、DeleteBlankRows)を選択
9.[実行]ボタンをクリック




特定列が未入力の場合その行を削除

【問題】
 マクロで、C列D列のどちらにもデータ、数式、コメントが入っていない行を削除するにはどうしたら良いでしょうか?

【回答】
Sub DeleteBlankRows2()
  Application.ScreenUpdating = false
    On Error Resume Next
    With Columns("C:D")
      .SpecialCells(xlCellTypeConstants).EntireRow.Hidden = true
      .SpecialCells(xlCellTypeFormulas).EntireRow.Hidden = true
      .SpecialCells(xlCellTypeComments).EntireRow.Hidden = true
     
      .SpecialCells(xlCellTypeVisible).EntireRow.Delete
      .EntireRow.Hidden = False
    End With
  Application.ScreenUpdating = true
End Sub

【解説】
 前回のコードの With Cells のところを With Columns("C:D") に変更しただけです。

 「A列のセルにデータ、数式、コメントが入っていない行を削除」という場合には、 With Columns("C:D") のところを

With Columns("A")

または

With Columns(1)

のようにします。




行の削除

【問題】
 マクロで、A列に 2 が入力されていたらその行を削除するにはどうしたら良いでしょうか?

Data1 Data2 Data3
3 2 7
1 5 1
2 2 1 この行削除
2 6 3 この行削除
5 9 6
2 0 8 この行削除

【回答】
Sub Test()
  Const intCriteria As Integer = 2
 
  With Cells(2, 1).CurrentRegion
    On Error GoTo errhandler
    .AutoFilter Field:=1, Criteria1:=intCriteria
    .Offset(1).Resize(.Rows.Count - 1). _
    SpecialCells(xlCellTypeVisible).EntireRow.Delete
  End With
  ActiveSheet.AutoFilterMode = false
  Exit Sub
 
errhandler:
  ActiveSheet.AutoFilterMode = false
  MsgBox intCriteria & "はありません。"
End Sub

【解説】
 上記マクロは以下のような流れになっています。

1.メニュー[データ]-[フィルタ]-[オートフィルタ]
2.A列のオートフィルタ矢印をクリックして、 2 を選択
3.列見出しを除く可視セルの行を削除
4.オートフィルタを解除

 A列に 2 が入力されているセルがなければ、「2はありません。」というメッセージが表示されます。

 For〜Nextでしたら、以下のような感じでしょうか。

Sub Test2()
  Dim lngRow As Long
  Dim lngCount As Long
  
  lngRow = Cells(Rows.Count, 1).End(xlUp).Row
  
  For lngCount = lngrow to 2 step -1
    If Cells(lngCount, 1).Value = 2 then rows(lngcount).delete
  Next
End Sub




文字の色が赤のセルをイタリックに

【問題】

 シート内に文字の色が赤に設定されているセルがいくつかあります。
 そのセルの書式をイタリック(斜体)に設定するにはどうしたら良いでしょうか?
 マクロで実現します。

【回答】

Sub test()
  Dim c As Range
   
  Application.ScreenUpdating = False
    For Each c In ActiveSheet.UsedRange
      With c.Font
        If .Color = vbred then .italic = true
      End With
    Next
  Application.ScreenUpdating = true
End Sub

【解説】

 色の定数には以下があります。

vbBlack    黒
vbRed      赤
vbGreen    緑
vbYellow   黄
vbBlue     青
vbMagenta  マゼンタ
vbCyan     シアン
vbWhite    白




文字の色が赤の場合、その文字をイタリックに

【問題】

 シート内にセル内の一部の文字の色が赤に設定されているセルがいくつかあります。
 その赤字の文字の書式だけをイタリック(斜体)に設定するにはどうしたら良いでしょうか?
 マクロで実現します。

【回答】

Sub test2()
  Dim c As Range
  Dim i As Integer
 
  Application.ScreenUpdating = false
    For Each c In ActiveSheet.UsedRange
      For i = 1 to c.characters.count
        With c.Characters(i, 1).Font
          If .Color = vbred then .italic = True
        End With
      Next
    Next
  Application.ScreenUpdating = true
End Sub

【解説】

 ScreenUpdatingプロパティの値をFalseにすることで画面を更新しないようにします。これでマクロの実行速度が速くなります。
 マクロ終了後、ScreenUpdatingプロパティの値をTrueに戻します。

 イタリックではなく、太字にするには、 .Italic = true のところを .bold = True とします|




複数の非表示のシートを一度に再表示

【問題】

 ブック内に20前後のシートがあり、その内10シートを非表示にしています。
 マクロで非表示になっているシートを全部再表示するには、どうしたら良いでしょうか?

【回答】

Sub test()
  Dim Sh As Object
 
  Application.ScreenUpdating = False
    For Each Sh In Sheets
      Sh.Visible = true
    Next
  Application.ScreenUpdating = true
End Sub

【解説】

 複数のシートを非表示にするには、以下の手順です。

1.Ctrlキーを押しながら非表示にしたいシートのシート見出しをクリックして複数シートを選択
2.メニュー[書式]-[シート]-[表示しない]

 非表示になっているシートを再表示するには、以下の手順です。

1.メニュー[書式]-[シート]-[再表示]
2.再表示させたいシートを選択
3.Enter

 回答で示したコードはグラフシートも対象にしています。
 ワークシートだけを対象にする場合には以下のようになります。

Sub test2()
  Dim Sh As Worksheet
 
  Application.ScreenUpdating = False
    For Each Sh In Worksheets
      Sh.Visible = true
    Next
  Application.ScreenUpdating = true
End Sub




シート一覧の作成

【問題】

 ブック内のシート名を一覧表示するにはどうすれば良いでしょうか?

【回答】

Sub test()
  Dim i As Integer
 
  For i = 1 to sheets.count
    ActiveCell.Offset(i - 1).Value = sheets(i).name
  Next
  ActiveCell.EntireColumn.AutoFit
End Sub

【解説】

 回答で示したコードはグラフシートも対象にしています。
 ワークシートだけを対象にする場合には以下のようになります。

Sub test2()
  Dim i As Integer
 
  For i = 1 to worksheets.count
    ActiveCell.Offset(i - 1).Value = worksheets(i).name
  Next
  ActiveCell.EntireColumn.AutoFit
End Sub




セル内の一部の文字列を抽出

【問題】

 セル内の "『" と "』" で挟まれた文字列をマクロを使って他のセルに書き出すにはどうしたら良いでしょうか?

 例えば、セルA1に、

あいうえお『かき』くけこ

が入力されているとします。。

 これを、 "『" と "』" で挟まれた文字列 "か" のみ抽出し、セルB1に、

かき

と表示させたいのです。

※ "『" と "』"は、セル内にそれぞれ一つずつしか存在しません。
※ "『" と "』"の位置は固定されていません。何文字目か不明確です。
※ "『" と "』"に挟まれた文字数は一定ではありません。何も入っていないこともありますし、1文字以上入っていることもあります。

【回答】

 範囲を選択して、以下のマクロを実行すると右隣のセルに"『" と "』" で挟まれた文字列を抽出します。

Sub test()
  Const Chr1 As String = "『"
  Const Chr2 As String = "』"
 
  Dim c As Range
  Dim Srch As String
  Dim Btwn As String
 
  For Each c In Selection
    Srch = c.Value & Chr1 & Chr2
    Btwn = mid(srch, instr(srch, chr1) + 1, _
    InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1)
    c.Offset(, 1).Value = Btwn
  Next
End Sub

【解説】

 ワークシート関数だと、

=MID(A1,FIND("『",A1&"『』")+1,FIND("』",A1&"『』")-FIND("『",A1&"『』")-1)

といった感じになります。




セルに入力した数値で範囲選択

【問題】

 セルA1に入力した任意の数だけ2行目以下の行を選択するにはどうしたら良いでしょうか?
 例えばセルA1に 3 と入力したら、A2:A4を選択するようにしたいのです。

【回答】

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim lngRows As Long
  lngRows = Cells(1, 1).Value

  If Target.Address <> "$A$1" Then Exit Sub
  If lngRows < 1 Or lngRows > Rows.Count - 1 Then Exit Sub
  Cells(2, 1).Resize(lngRows).Select
End Sub

【解説】

 シートタブ上で右クリック-[コードの表示]で表示されるコードウィンドウに上記マクロを入力します。




ハイパーリンクをURL表示に

【問題】

 セルに会社名を表記し、ハイパーリンクでURLを入力してあります。
 それをURL表記に変更したいのですが、一件ずつやる方法ではなく、一度に変更する方法はないでしょうか?

【回答】

Sub test()
 Dim c As Range

 For Each c In ActiveSheet.UsedRange
  If c.Hyperlinks.Count = 1 then
   c.Value = c.hyperlinks(1).address
  End If
 Next
End Sub

【解説】

 上記マクロを実行するには以下の手順です。

1.Alt+F11(メニュー[ツール]−[マクロ]−[VBE])
2.メニュー[挿入]-[標準モジュール]
3.上記マクロコードをコピーして、コードウィンドウ上でCtrl+V (貼り付け)
4.Alt+Q(VBEを終了)
→ワークシートに戻る
5.Alt+F8(メニュー[ツール]-[マクロ]-[マクロ])
6. test を選択して[実行]ボタンをクリック




数値を文字に置換

【問題】

 シート内に1〜6までの数字が複数あり、この数字と一致した場合、A、B、C、D、E、Fにそれぞれ置き換えたいのですがどうすれば良いでしょうか?
 マクロで実現します。

【回答】

Sub Test()
  Dim i As Integer
 
  For i = 1 to 6
    Cells.Replace What:=i, replacement:=Chr(64 + i)
  Next
End Sub

【解説】

 Ctrl+H (メニュー[編集]-[置換])で[検索する文字列]に 数字 を、[置換後の文字列]に 対応するアルファベット を入力、これを6回繰り返すことを上記マクロは実行しています。

 アルファベット A のコード番号は 65 、Bのコード番号は66 ・・・とコード番号は1ずつ増えていきます。そこで、[置換後の文字列]として、Chr(64 + i) としているわけです。




1を加算してコピー

【問題】

 たとえばD1:D18に数値が入っています。
 これに 1 を 加算した数値をB3:B20へコピーするにはどうしたら良いでしょうか?
 マクロで実現します。

【回答】

Sub test()
  With Range("B3:B20")
    .Formula = "=D1+1"
    .Copy
    .PasteSpecial Paste:=xlValues
  End With
  Application.CutCopyMode = False
End Sub

【解説】

 上記マクロは以下を実行しています。

1.B3:B20を選択
→セルB3がアクティブでB3:B20を選択している状態
2.=D1+1 をCtrl+Enterで入力
3.Ctrl+C (コピー)
4.メニュー[編集]-[形式を選択して貼り付け]
5.[値]にチェックしてEnter




複数セルの文字列を一つにまとめるには

【問題】

 A2:A100に文字列が入っています。

例:あ、い、う、え、お、か、き、く、、、、100

 セルA1に、それぞれの文字列の間に「・」を入れて、それらをまとめた

あ・い・う・え・お・、、、、・99・100

を表示させたいのですが、どうすれば良いでしょうか?
 マクロで実現します。

【回答】

Sub Moji_Chain2()
  Dim MojiChain As String
  Dim c As Range
 
  For Each c In Range("A2:A100")
    If c.Value <> "" Then MojiChain = MojiChain & c.Value & "・"
  Next
 
  Range("A1").Value = Left(MojiChain, Len(MojiChain) - 1)
End Sub

【解説】

 ワークシート関数だったら、以下のような感じでしょうか?

=A2&"・"&A3&"・"&A4&"・"&A5

 これが &"・"&A100 まで続きます。長いですね ^^;




相対参照と絶対参照を混合して使う

【問題】

 マクロで複数のセルに式を入力するには、以下のようなコードを使います。

Sub test()
  Range("B1:B10").Formula = "=C1+D1"
End Sub

 これで、
セルB1には =C1+D1
セルB2には =C2+D2
のように数式が入力されます。

 数式内に相対参照と絶対参照を混合して使うにはどういうコードを使えば良いでしょうか?

B1の内容=C1の内容+D1の内容*A1の内容
B2の内容=C2の内容+D2の内容*A1の内容
B3の内容=C3の内容+D3の内容*A1の内容
               ・
               ・
Bnの内容=Cnの内容+Dnの内容*A1の内容

といったことをしたいのです。
(A1は普遍で常に参照しています)

【回答】

Sub test()
  Range("B1:B10").Formula = "=C1+D1*$A$1"
End Sub

【解説】

 数式ではなく値にということでしたら、以下はいかがでしょう?

Sub test2()
  With Range("B1:B10")
    .Formula = "=C1+D1*$A$1"
    .Copy
    .PasteSpecial Paste:=xlValues
  End With
  Application.CutCopyMode = False
End Sub




ロックしていないセルデータの削除

【問題】

 ロックしていないセルのデータだけを削除したいのですが、どうすれば良いでしょうか?
 マクロで実現します。

【回答】

Sub test()
  Dim c As Range
 
  For Each c In ActiveSheet.UsedRange
    If Not (c.Locked) Then c.ClearContents
  Next
End Sub

【解説】

 セルのロック、シートの保護については以下のページをご覧ください。

【エクセル技道場】−シート−シートの保護
http://www2.odn.ne.jp/excel/waza/sheet.html#SEC9




ロックしていないセルデータの削除(結合セル)

【問題】

 ロックしていないセルのデータだけを削除したいのですが、どうすれば良いでしょうか?
 一部、結合セルがあります。

【回答】

Sub test2()
  Dim c As Range
 
  With ActiveSheet
    .Unprotect
    For Each c In .UsedRange
      If Not (c.Locked) Then c.MergeArea.ClearContents
    Next
    .Protect UserInterfaceOnly:=True
  End With
End Sub

【解説】

・シートの保護を解除
・処理(ロックしていないセルのデータだけを削除)
・シートの保護
を実行しています。




[記録終了]ツールバーの再表示

【問題】

 メニュー[ツール]-[マクロ]-[新しいマクロの記録]で[OK]ボタンをクリックすると、[記録終了]ボタンと[相対参照]ボタンがある[記録終了]ツールバーが表示されますが、ある時からこの[記録終了]ツールバーが表示されなくなりました。
 どうしたら、[記録終了]ツールバーを表示させるようにできるでしょうか?

【回答】

1.メニュー[ツール]-[マクロ]-[新しいマクロの記録]
2.[OK]ボタンをクリック
3.メニューバー/ツールバー上のどこかで右クリック
4.[記録終了]をクリック

【解説】

 一度マクロの自動記録状態にしてから、ツールバー右クリックで[記録終了]が選択できるようになります。




相対参照でマクロの記録

【問題】

 例えば、右隣のセルを選択するというマクロを作成したいのですが、

1.セルA1を選択
2.メニュー[ツール]-[マクロ]-[新しいマクロの記録]
3.[OK]ボタンをクリック
4.セルB1を選択
5.[記録終了]ボタンをクリック

という手順でマクロの自動記録をして、セルC1を選択してからAlt+F8で上記マクロを実行すると、セルB1が選択されます。
 これをセルC1を選択してマクロを実行するとセルD1が選択、セルA2を選択してマクロを実行するとセルB2が選択されるように、マクロの自動記録をするにはどうしたら良いでしょうか?

【回答】

1.メニュー[ツール]-[マクロ]-[新しいマクロの記録]
2.[OK]ボタンをクリック
3.[記録終了]ツールバーの[相対参照]ボタンをクリック
4.記録したい操作を実行
5.[記録終了]ボタンをクリック

【解説】

 [相対参照]ボタンをクリックしないで[新しいマクロの記録]とすると、

Sub Macro1()
  Range("B1").Select
End Sub

のようなコードが作成されます。

 [相対参照]ボタンをクリックして[新しいマクロの記録]とすると、

Sub Macro2()
  ActiveCell.Offset(0, 1).Range("A1").Select
End Sub

のようなコードが作成されます。
 通常は、.Range("A1")の部分は不要なので、自分でコードを作成する場合には、


Sub test()
  ActiveCell.Offset(0, 1).Select
End Sub

のようなコードになります。




相対参照から絶対参照に

【問題】

 数式を絶対参照に一括で変換をする方法はあるでしょうか?
 例えば =A1+B1 といった数式を =$A$1+$B$1 へとしたいのですが‖一箇所のホルだけではなく‖複数のホルの数式の絶対子照への変換を一括で行う方法はないでしょうか”

【回答】

Sub test()
  Dim c As Range
 
  For Each c In Selection
    If c.HasFormula Then
      c.Formula = Application.ConvertFormula(Formula:=c.Formula, _
        FromReferenceStyle:=xlA1, toabsolute:=xlAbsolute)
    End If
  Next
                 
End Sub

【解説】

 ToAbsolute:= のところで、変換後の参照の種類を指定します。

xlAbsolute     行列とも絶対参照に
xlAbsRowRelColumn 行だけ絶対参照に
xlRelRowAbsColumn 列だけ絶対参照に
xlRelative     行列とも相対参照に

 以下のページもご参考になるのでは?

[XL97] 数式の特定セルへの参照形式を変更する方法
http://support.microsoft.com/default.aspx?scid=kb;ja;408067&Product=excelJPN




数式が入力されているセルに色をつける

【問題】

 シート内で数式が入力されているセルだけに色を付けるにはどうしたら良いでしょうか?

【回答】

1.Alt+F11
2.メニュー[挿入]-[標準モジュール]
3.コードウィンドウに以下を入力

Sub test()
  With Cells
    .Interior.ColorIndex = xlnone
    On Error Resume Next
    .SpecialCells(xlCellTypeFormulas).Interior.Color = vbYellow
  End With
End Sub

4.Alt+F4(VBEを閉じる)
5.Alt+F8(メニュー[ツール]-[マクロ]-[マクロ]
6.マクロ test を選択して[実行]ボタンをクリック

【解説】

 上記マクロは以下を実行しています。

1.Ctrl+A(全セルを選択)
2.Ctrl+1 (メニュー[書式]-[セル])
3.[パターン]タブで 色なし をクリック
4.[OK]ボタンをクリック
5.Ctrl+G (メニュー[編集]-[ジャンプ])
6.[セル選択]ボタンをクリック
7.[数式]にチェック
8.Enter
9.Ctrl+1 (メニュー[書式]-[セル])
10.[パターン]タブで 黄色 をクリック




図形の削除

【問題】

 マクロでシートに貼り付けた図形(複数)を一度に全部削除させたいのですが、どうすればよいでしょうか?

【回答】

Sub Test2()
  ActiveSheet.DrawingObjects.Delete
End Sub

【解説】

 一般操作だと以下の手順になります。

1.Ctrl+G (メニュー[編集]-[ジャンプ])
2.[セル選択]ボタンをクリック
3.[オブジェクト]にチェックを入れる
4.Enter
5.Deleteキー




数値や文字列だけをクリア

【問題】

 マクロで、計算式が入っているセルはそのままにしておいて、数値や文字列などが入力されてるセルのデータをクリアするにはどうしたら良いでしょうか?

【回答】

Sub Test()
 On Error Resume Next
 Cells.SpecialCells(xlCellTypeConstants).ClearContents
End Sub

【解説】

 一般操作だと以下の手順になります。

1.Ctrl+G (メニュー[編集]-[ジャンプ])
2.[セル選択]ボタンをクリック
3.[定数]にチェックを入れる
4.Enter
5.Deleteキー




日付の桁を揃える

【問題】

 年月日を入力した時に前ゼロをスペースにし、桁を揃えたいのですがうまく出来ません。

平成9年9月14日
昭和60年10月4日

のようなデータを以下のように、月と日の位置をあわせたいのですが、どうすればよいでしょうか?

平成 9年 9月14日
昭和60年10月 4日

【回答】

○関数で桁を揃える。

 A列にデータが入っているとします。
 B列のフォントを MS ゴシック などの等幅フォントにします。

1.B列を選択
2.Ctrl+1 (メニュー[書式]-[セル])
3.[フォント]タブで MS ゴシック を選択
4.[OK]ボタンをクリック

 セルB1に以下の数式を入力します。

=TEXT(A1,"ggg")&
RIGHT(TEXT(A1," e年"),3)&
TEXT(MONTH(A1),"??月")&
TEXT(DAY(A1),"??日")

○そのセルの表示形式を変更して年月日の桁を揃える。

1.セルを選択
2.Ctrl+1 (メニュー[書式]-[セル])
3.[表示形式]タブの[分類]を[ユーザー定義]に
4.[種類]に

年1桁、月1桁、日1桁 → ggg_1e"年"_1m"月"_1d"日"
年1桁、月1桁、日2桁 → ggg_1e"年"_1m"月"d"日"
年1桁、月2桁、日1桁 → ggg_1e"年"m"月"_1d"日"
年1桁、月2桁、日2桁 → ggg_1e"年"m"月"d"日"
年2桁、月1桁、日1桁 → ggge"年"_1m"月"_1d"日"
年2桁、月1桁、日2桁 → ggge"年"_1m"月"d"日"
年2桁、月2桁、日1桁 → ggge"年"m"月"_1d"日"
年2桁、月2桁、日2桁 → ggge"年"m"月"d"日"

を入力

5.[OK]ボタンをクリック

○マクロでA列に日付が入力されると年月日の桁を揃える。

 シートタブ上で右クリック-[コードの表示]で表示されるコードウィンドウに下記マクロを入力。

Private Sub Worksheet_Change(ByVal Target As Range)
 Dim tmp As Variant
  
 With Target
  If .Column <> 1 Then Exit Sub 'A列のみを対象
  tmp = .value
  If IsDate(tmp) Then
   .NumberFormatLocal = "ggg" & _
    IIf(Format(tmp, "e") > 9, "e年", "_0e年") & _
    IIf(Month(tmp) > 9, "m月", "_1m月") & _
    IIf(Day(tmp) > 9, "d日", "_1d日")
  End If
 End With
End Sub

○マクロで選択した範囲の日付の年月日の桁を揃える。

Sub test()
 Dim c As Range
 Dim tmp As Variant
 
 Application.ScreenUpdating = false
  For Each c In Intersect(Selection, ActiveSheet.UsedRange)
   tmp = c.value
   If IsDate(tmp) Then
    c.NumberFormatLocal = "ggg" & _
     IIf(Format(tmp, "e") > 9, "e年", "_1e年") & _
     IIf(Month(tmp) > 9, "m月", "_1m月") & _
     IIf(Day(tmp) > 9, "d日", "_1d日")
   End If
  Next
 Application.ScreenUpdating = true
End Sub

1.上記マクロの Sub から End Sub までを選択してCtrl+C (コピー)
2.Alt+F11(メニュー[ツール]-[マクロ]-[VBE])
→VBE(Visual Basic Editor)が開く
3.プロジェクトエクスプローラで、VBAProject(<当該ブック名>)を選択
4.メニュー[挿入]-[標準モジュール]
5.Ctrl+V (貼り付け)
6.Alt+F4(メニュー[ファイル]-[終了してMicrosoft Excelへ戻る])
7.桁を揃えたいセル範囲を選択
8.Alt+F8(メニュー[ツール]-[マクロ]-[マクロ])
9.実行したいマクロ名(この場合、test)を選択
10.[実行]ボタンをクリック