2018年10月4日木曜日

ミニマクロ


Sub 空白埋め()
'########################
'#  範囲を指定して空白を埋めます
'########################
Dim SCol As Variant, RCol As Variant, SRow As Variant
        SCol = InputBox("埋める【開始列】を" & vbCrLf & _
        "【数字】で入力")
  
        ECol = InputBox("埋める【終了列】を" & vbCrLf & _
        "【数字】で入力")
  
        SRow = InputBox("何行目から始めますか?" & vbCrLf & _
        "【開始行】【数字】で入力")
  
        'キャンセルを押されたらマクロを停止する
        If SCol = "" Or ECol = "" Or SRow = "" Then Exit Sub
  
        'エラーチェックをしたので数字にする
        SCol = Val(SCol)
        ECol = Val(ECol)
        SRow = Val(SRow)
 
 Dim Sh As Worksheet
 Dim rngTARGET As Range
 Dim BUF As Variant
 Dim r As Long
 Dim c As Long
 Dim MaxRow As Long
 Dim cRM As Range

        Set Sh = ActiveSheet
       
        '指定した列の中で一番行数が多い列の行数を変数に入れる【MaxRow】
        For Each cRM In Range(Cells(SRow, SCol), Cells(SRow, ECol))  '最初の行の開始終了列
                If Sh.Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow Then
                        MaxRow = Sh.Cells(Rows.Count, cRM.Column).End(xlUp).Row
                End If
        Next

        '2行目以下の使用済みセル範囲の値を配列化【rngTARGET】
        Set rngTARGET = Sh.Range(Cells(SRow, SCol), Cells(MaxRow, ECol))
       
        BUF = rngTARGET.Value
       
        '空白を埋める
        For r = 1 To UBound(BUF)  '行方向
                For c = 1 To UBound(BUF, 2)
                        If IsEmpty(BUF(r, c)) Then
                                BUF(r, c) = BUF(r - 1, c)
                        End If
                Next c
        Next r
       
        'データ書き出し
        rngTARGET.Value = BUF
       
        '後始末
        Erase BUF
        Set rngTARGET = Nothing
        Set Sh = Nothing

 MsgBox "空白を埋めました"
 End Sub


 Sub 確認_複数シートを1シート()

'########################
'#  複数のシートを1つのシートにまとめます。
'#  見出しは最初のシートから作られます。
'#  1行目に見出し行がある同じ形式のシートを1枚にまとめたい時に使います。
'########################
選択 = MsgBox("見出しが同じ複数のシートを1つのシートにまとめます。" & vbCrLf & _
        "見出しは最初のシートから作られます。(見出しの複数行指定は不可)" & vbCrLf & _
        "実行しますか?", vbYesNo + vbExclamation, _
        "複数シートを1シートにまとめる")
       
        If 選択 = vbYes Then               '[はい]なら
                複数シートを1シート
        Else                                            '[いいえ]なら
                Exit Sub
        End If
End Sub
 Sub 複数シートを1シート()

'########################
'#  複数のシートを1つのシートにまとめます。
'#  見出しは最初のシートから作られます。
'#  1行目に見出し行がある同じ形式のシートを1枚にまとめたい時に使います。
'########################
Dim SCol As Variant, SRow As Variant
    SRow = InputBox("見出しは【何行目】にありますか?" & vbCrLf & _
        "【数字】で入力してください")
       
    SCol = InputBox("データは【何列目】から始まりますか?" & vbCrLf & _
        "【数字】で入力してください")
       
        'キャンセルが押されたらマクロを終了する
        If SRow = "" Or SCol = "" Then Exit Sub
       
    'エラーチェックをしたので数字にする
    SRow = Val(SRow)
    SCol = Val(SCol)
       
Dim i As Integer
Dim MaxRow As Long, MaxRow2 As Long, ECol As Long
Dim cRM As Range
Dim PSh As Worksheet
Dim CSh As Worksheet
        Application.ScreenUpdating = False
    '-----全データシートの有無をチェックします
    Call sh_check
    Set PSh = Worksheets("全データ")
    Set CSh = Worksheets(2)
    '------見出し行をたどって列数を決める
    ECol = CSh.Cells(SRow, Columns.Count).End(xlToLeft).Column
   
        '------列見出しをコピー
        CSh.Range(CSh.Cells(SRow, SCol), CSh.Cells(SRow, ECol)).Copy PSh.Range(PSh.Cells(1, 1), PSh.Cells(1, ECol))
       
            For i = 2 To Worksheets.Count
                With Worksheets(i)
                    Set CSh = Worksheets(i)
                   
                    '指定した列の中で一番行数が多い列の行数を変数に入れる
                    For Each cRM In Range(.Cells(SRow, SCol), .Cells(SRow, ECol))
                        If .Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow Then
                            MaxRow = .Cells(Rows.Count, cRM.Column).End(xlUp).Row
                        End If
                    Next
                   
                    '-----シートのデータが2行以上の場合にコピー
                    If MaxRow >= 2 Then
                   
                        '指定した列の中で一番行数が多い列の行数を変数に入れる★貼付側
                        For Each cRM In Range(PSh.Cells(1, 1), PSh.Cells(1, ECol))
                            If PSh.Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow2 Then
                                MaxRow2 = PSh.Cells(Rows.Count, cRM.Column).End(xlUp).Row + 1
                            End If
                        Next
                       
                        .Activate
                        .Range(Cells(SRow + 1, SCol), Cells(MaxRow, ECol)).Copy PSh.Cells(MaxRow2, 1)
                    End If
                End With
               
            Next i
           
            PSh.Activate
            Range("A1").Select
            Application.ScreenUpdating = True
           
        MsgBox "シートをまとめました"
       
End Sub
Sub sh_check()
'########################
'#  シートの有無を判定
'########################
Dim newSh As String
Dim Sh As Worksheet, myFlag As Boolean
        newSh = "全データ"
        myFlag = False
       
            For Each Sh In ActiveWorkbook.Worksheets
                If Sh.Name = newSh Then
                    myFlag = True
                    '-----全データシートのデータをクリアし、先頭へ移動します
                    Worksheets(newSh).Cells.ClearContents
                    Worksheets(newSh).Move before:=Worksheets(1)
                End If
            Exit For
            Next Sh
            '-----全データシートを先頭へ追加します
            If myFlag = False Then
                ActiveWorkbook.Worksheets.Add(before:=Worksheets(1)).Name = newSh
            End If
End Sub
Sub 確認_複数列の比較()
'########################
'#  4列までのデータを比較します。
'#  同じデータがあればOK、なければNGを出します。
'#  動きが重いので行数が多いと待たされます
'########################
選択 = MsgBox("上下に並んだ2つのデータを比較します。" & vbCrLf & _
"【!】必ずA列から開始します" & vbCrLf & _
"【!】双方のデータ間は2行以上開けてください" & vbCrLf & _
"比較できるのは4列までです" & vbCrLf & _
"実行しますか?", vbYesNo + vbExclamation, _
"複数列の比較")
        If 選択 = vbYes Then
            複数列の比較
        Else
            Exit Sub
        End If
End Sub
Sub 複数列の比較()
'########################
'#  4列までのデータを比較します。
'#  同じデータがあればOK、なければNGを出します。
'#  動きが重いので行数が多いと待たされます
'########################
Dim i As Integer, ii As Integer, res1 As Variant, res2 As Variant
res1 = InputBox("データ1の開始行番号を入力してください")
res2 = InputBox("データ2の開始行を入力してください")
       'キャンセルを押されたらマクロを停止する
        If res1 = "" Or res2 = "" Then Exit Sub
   
        'エラーチェックをしたので数字にする
        res1 = Val(res1)
        res2 = Val(res2)
   
        '画面更新を休止する
       ' Application.ScreenUpdating = False
       
            For i = res1 To Range("A" & res1).End(xlDown).Row
                For ii = res2 To Range("A" & res2).End(xlDown).Row
                    If Cells(ii, 1).Value = Cells(i, 1).Value And Cells(ii, 2).Value = _
                       Cells(i, 2).Value And Cells(ii, 3).Value = Cells(i, 3).Value Then
                            If Cells(ii, 4).Value <> Cells(i, 4).Value Then
                                If Cells(i, 6).Value = "" Then
                                    Cells(i, 6).Value = Rows(ii).Row
                                Else
                                    Cells(i, 6).Value = Cells(i, 6).Value & "," & Rows(ii).Row
                                End If
                            Else
                                If Cells(i, 6).Value = "" Then
                                    Cells(i, 6).Value = Rows(ii).Row & "-OK"
                                Else
                                    Cells(i, 6).Value = Cells(i, 6).Value & "," & Rows(ii).Row & "-OK"
                                End If
                            End If
                        End If
                    Next
            Next
        With Cells(res1, 5)
            .FormulaR1C1 = "=if(iserror(find(""OK"",rc[1],1))=false,""OK"",""NG"")"
            .Copy
        End With
       
        Range(Cells(res1, 5), Cells(Range("A" & res1).End(xlDown).Row, 5)).PasteSpecial Paste:=xlPasteFormulas
       
        Application.CutCopyMode = False
       
       ' Application.ScreenUpdating = True
       
    MsgBox "比較が完了しました"
End Sub
                      
 Sub ハイパーリンク削除()

'########################
'#  開いているシートのハイパーリンクを全部削除します。
'#
'#
'########################
選択 = MsgBox("今開いているシートのハイパーリンクを全部削除します。実行しますか?", vbYesNo + vbExclamation, _
"ハイパーリンクの削除")
        If 選択 = vbYes Then
            ActiveSheet.Hyperlinks.Delete
        Else
            Exit Sub
        End If
MsgBox "ハイパーリンクを削除しました"
End Sub
Sub 文字列を結合する()

'########################
'#  複数行に同じ文字列が連続するセルを結合します
'#
'#
'########################
Dim myCol As Integer
Dim SCol As Variant
Dim ECol As Variant
Dim SRow As Variant
Dim myRng As Range
Dim myRow As Long
Dim cRM As Range
Dim MaxRow As Long
        SCol = InputBox("縦方向に同じ文字があれば結合します。【何列目】から開始しますか?数字で列を指定してください")
ECol = InputBox("何列目まで作業しますか?数字で列を指定してください")
SRow = InputBox("何行目から開始しますか?数字で行を指定してください")
    'キャンセルを押されたらマクロを停止する
    If SCol = "" Or ECol = "" Or SRow = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SCol = Val(SCol)
    ECol = Val(ECol)
    SRow = Val(SRow)
   
    '指定した列の中で一番行数が多い列の行数を変数に入れる
    For Each cRM In Range(Cells(SRow, SCol), Cells(SRow, ECol))
        If Cells(Rows.Count, cRM.Column).End(xlUp).Row > MaxRow Then
            MaxRow = Cells(Rows.Count, cRM.Column).End(xlUp).Row
        End If
    Next
   
    '画面更新を休止する
    Application.ScreenUpdating = False
   
    '列[myCol]==============================
   
        myCol = SCol  'SCol 列から
   
        Do While myCol <= ECol     'ECol列まで、以下を繰り返します
   
    '行[myRow]==============================
   
        '指定行から各列を場所指定
        Set myRng = Cells(SRow, myCol)
       
            '指定行、指定列の中で以下作業をする
            With Cells(myRow, myCol)
                '今いる行の上の一つ下と今の行の値が同じなら
                If .Value = .Offset(1, 0).Value Then
                    '下の行と今の行を範囲指定する
                    Set myRng = Union(myRng, .Offset(1, 0))
                '下の行が違う値なら
                Else
                    '指定範囲の結合を実行する
                    Application.DisplayAlerts = False
                    myRng.Merge
                    Application.DisplayAlerts = True
                   
                    '一つ下に進む
                    Set myRng = .Offset(1, 0)
                End If
            End With
        Next
    '列================
        '次の列に進む
        myCol = myCol + 1
        Loop
        '画面更新を再開する
        Application.ScreenUpdating = True
    MsgBox "結合しました"
End Sub
   
Sub オートフィルタ等解除()

'########################
'#  ウィンドウ分割とオートフィルタを解除
'# 解除したいしオートを開いてから実行する
'#
'########################
Dim xlApp As Excel.Application
選択 = MsgBox("今開いているシートのウィンドウ分割とオートフィルタを解除します。実行しますか?", vbYesNo + vbExclamation, _
"ウィンドウ分割とオートフィルタを解除")
    If 選択 = vbYes Then
        '画面更新を休止する
        Application.ScreenUpdating = False
       
        Cells.Select
        Selection.EntireColumn.Hidden = False
        ウィンドウ分割解除
        オートフィルタ解除
    Else
        Exit Sub        '実行中止
    End If
   
        '画面更新を再開する
        Application.ScreenUpdating = True
    MsgBox "ウィンドウ分割とオートフィルタを解除しました"
   
End Sub
Sub オートフィルタ解除()
    If ActiveSheet.AutoFilterMode Then ActiveSheet.AutoFilterMode = False
End Sub
Sub ウィンドウ分割解除()
    ActiveWindow.FreezePanes = False
   
End Sub
   
Sub 指定行削除す()

'########################
'#  特定の文字列がある行を削除したい場合に使用
'# 作業したいシートを開いてから実行する
'#
'########################
res1 = InputBox("指定したキーワードがある行を削除します。" & vbCrLf & _
    "【キーワード】を入力してください「*」使用可。")
SCol = InputBox("キーワードがある【列】は何列目ですか?" & vbCrLf & _
"【数字】で指定してください")
    'キャンセルを押されたらマクロを停止する
    If SCol = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SCol = Val(SCol)
   
    'データ最終行
    MaxRow = Cells(Rows.Count, SCol).End(xlUp).Row
    Application.ScreenUpdating = False
    For i = MaxRow To 1 Step -1
        If Cells(i, SCol) Like res1 Then
            Range(i & ":" & i).Delete
        End If
       
        Next i
        Application.ScreenUpdating = True
       
        MsgBox "行を削除しました"
       
End Sub
Sub 指定行挿入()

'########################
'#  特定の文字列の上に行を挿入したい場合に使用
'# 作業したいシートを開いてから実行する
'#
'########################

Dim res1 As String
Dim MaxRow As Long
Dim i As Long
Dim SCol As Variant
res1 = InputBox("指定したキーワードがある行の上に行を挿入します。" & vbCrLf & _
    "【キーワード】を入力してください「*」使用可。")
SCol = InputBox("キーワードがある【列】は何列目ですか?" & vbCrLf & _
"【数字】で指定してください")

    'キャンセルを押されたらマクロを停止する
    If SCol = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SCol = Val(SCol)
   
    'データ最終行
    MaxRow = Cells(Rows.Count, SCol).End(xlUp).Row
    Application.ScreenUpdating = False
    For i = MaxRow To 1 Step -1
        If Cells(i, SCol) Like res1 Then
            Range(i & ":" & i).Insert
        End If
       
        Next i
        Application.ScreenUpdating = True
       
        MsgBox "行を挿入しました"
       
End Sub
Sub 指定列削除()
'########################
'#  特定の見出しの前に列を挿入したい場合に使用
'# 作業したいシートを開いてから実行する
'# 画面更新をoffにすると削除できない・・
'########################
Dim res1 As String
Dim SRow As Variant
Dim MaxCol As Long
Dim i As Long
res1 = InputBox("指定したキーワードがある列を削除します。" & vbCrLf & _
"【キーワード】を入力してください。「*」使用可")
SRow = InputBox("キーワードがある【行】は何行目ですか?" & vbCrLf & _
"【数字】で指定してください")
    'キャンセルを押されたらマクロを停止する
    If SRow = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SRow = Val(SRow)
   
    'データ最終列
    MaxCol = Cells(SRow, Columns.Count).End(xlToLeft).Column
   
    For i = MaxCol To 1 Step -1
        If Cells(SRow, i) Like res1 Then
            Columns(i).Delete
        End If
    Next i
MsgBox "列を削除しました"
End Sub

Sub 指定列挿入()
'########################
'#  特定の見出しの前に列を挿入したい場合に使用
'# 作業したいシートを開いてから実行する
'#
'########################
Dim res1 As String
Dim SRow As Variant
Dim MaxCol As Long
Dim i As Long
res1 = InputBox("指定したキーワードがある列の前に列を挿入します。" & vbCrLf & _
"【キーワード】を入力してください。「*」使用可")
SRow = InputBox("キーワードがある【行】は何行目ですか?" & vbCrLf & _
"【数字】で指定してください")
    'キャンセルを押されたらマクロを停止する
    If SRow = "" Then Exit Sub
   
    'エラーチェックをしたので数字にする
    SRow = Val(SRow)
   
    'データ最終列
    MaxCol = Cells(SRow, Columns.Count).End(xlToLeft).Column
   
    Application.ScreenUpdating = False
   
    For i = MaxCol To 1 Step -1
        If Cells(SRow, i) Like res1 Then
            Columns(i).Insert
        End If
    Next i
   
    Application.ScreenUpdating = False
MsgBox "列を挿入しました"
End Sub
Sub 指定列を全角に()
'########################
'#  半角を全角に変換します
'#
'########################
Dim x As Long
Dim y1 As Long
Dim y2 As Long
Dim aa As valiant
Dim bb As Range
y1 = InputBox("全角にしたい開始列を数字で入力してください")
y2 = InputBox("全角にしたい終了列を数字で入力してください") + 1
x = InputBox("全角にしたい行のはじめを数字で入力してください")
        Do While y1 < y2
            Columns(y1).Select         '列を選択します
            Set bb = Intersect(Selection, ActiveSheet.UsedRange)   '選択されたシートが指定の基準(コード入り)と一致する場合
            aa = bb.Value
           
                For x = x To UBound(aa, y1)   '1列1行~データが入っている最後のaa行1列まで
                    aa(x, y1) = StrConv(aa(x, y1), vbWide) '文字列を数字にします
                Next x
               
            bb.Value = aa
           
            Set bb = Nothing
           
            y1 = y1 + 1
        Loop
End Sub

End Sub