【Excel】フォルダ内のエクセルファイルに対して検索を行う

Dir関数を用いるため、ネットワーク上の長いファイルパスには未対応です。

Sub Test() 
    ' 検索速度向上のポイント
    ' 何度も登場するブックやセルは変数に格納し、メモリを参照する。
    ' 画面チラつきを防止する。

    ' 画面チラつきを防止する。
    Application.ScreenUpdating = False

    ' フォルダパスとファイル名を宣言する。
    Dim strFilePath As String
    Dim strFileNmae As String
         
    ' テキストボックスかセル入力でフォルダを指定させる。
    strFilePath = "C:\Users\test\Desktop\テストディレクトリ"
    
    ' 末尾が\ではない場合、\を追加する。(未実装)
    strFilePath = strFilePath & "\"
    
    ' 指定フォルダ内のファイル名を取得する。
    strFileName = Dir(strFilePath, vbNormal)

    ' 結果シートを変数に設定する。
    Dim resultBookSheet As Worksheet
    Set resultBookSheet = Worksheets("sheet1")
   
    ' 結果シートの行数を宣言する。
    Dim longGyo As Long
    longGyo = 1

    ' 指定フォルダ内のファイルがなくなるまで繰り返す。
    Do While strFileName <> ""

        Dim result As Range
        Dim firstAddress As String

        ' ファイルを開く。
        With Workbooks.Open(Filename:=strFilePath & strFileName)

            ' ファイル内のシート数を取得する。
            Dim sheetCnt As Long
            sheetCnt = .Worksheets.Count
           
            ' 1シート目からnシート目まで繰り返す。
            Dim i As Long
            For i = 1 To sheetCnt
                ' What:=検索するデータを指定
                ' After:=検索を開始するセルを指定
                ' LookIn:=値を検索
                ' LookAt:=一部が一致するセルを検索
                ' SearchOrder:=列単位で検索(行単位のxlByColumnsを指定しているとセル結合が検索されない)
                ' SearchDirection:=順方向に検索
                ' MatchCase:=大文字と小文字を区別しない
                ' MatchByte:=半角と全角を区別しない
                ' SearchFormat:=セル書式は検索条件に指定しない
                Set result = .Worksheets(i).Cells.Find(What:="APS" _
                    , After:=ActiveCell _
                    , LookIn:=xlValues _
                    , LookAt:=xlPart _
                    , SearchOrder:=xlByRows _
                    , SearchDirection:=xlNext _
                    , MatchCase:=False _
                    , MatchByte:=False _
                    , SearchFormat:=False)
               
                If Not result Is Nothing Then
                    firstAddress = result.Address
                    Do
                        resultBookSheet.Cells(longGyo, 1).Value = strFilePath & strFileName
                        resultBookSheet.Cells(longGyo, 2).Value = .Worksheets(i).Name
                        ' resultBookSheet.Cells(longGyo, 3).Value = "セル(" & result.Row & ", " & result.Column & ")"
                        resultBookSheet.Cells(longGyo, 3).Value = "セル(" & result.Address & ")"
                        resultBookSheet.Cells(longGyo, 4).Value = .Worksheets(i).Cells(result.Row, result.Column).Value
                        longGyo = longGyo + 1
                        Set result = .Worksheets(i).Cells.FindNext(result)
                        If result Is Nothing Then
                            Exit Do
                        End If
                        If result.Address = firstAddress Then
                            Exit Do
                        End If
                    Loop
                End If
            Next i
            
            ' 保存せずファイルを閉じる。
            .Close SaveChanges:=False
        End With

        ' 次のファイルを取得する。
        strFileName = Dir()
    Loop
        
    ' 画面チラつき防止を解除する。
    Application.ScreenUpdating = True
    
End Sub

【Excel】フォルダ内のエクセルファイルに対して情報を取得する

Dir関数を用いるため、ネットワーク上の長いファイルパスには未対応です。

Sub Test()

'
' Test Macro
'
' フォルダ内のファイルに対して処理を行います。
'
    ' 画面チラつきを防止する。
    Application.ScreenUpdating = False

    ' フォルダパスとファイル名を宣言する。
    Dim strFilePath As String
    Dim strFileNmae As String
 
    ' テキストボックスかセル入力でフォルダを指定させる。
    strFilePath = "C:\Users\test\Desktop\テストディレクトリ"
    strFilePath = Worksheets("sheet1").Cells(2, 1).Value
    
    ' 末尾が\ではない場合、\を追加する。(未実装)
    strFilePath = strFilePath & "\"
    
    ' 指定フォルダ内のファイル名を取得する。
    strFileName = Dir(strFilePath, vbNormal)

    ' 結果シートをアクティブにする。
    Worksheets("sheet1").Activate
   
    ' 結果シートの行数を宣言する。
    Dim longGyo As Long
    longGyo = 3

    ' 指定フォルダ内のファイルがなくなるまで繰り返す。
    Do While strFileName <> ""
        
        ' 結果配列とシート数を宣言する。
        Dim strArr() As String
        Dim sheetCnt As Long

        ' ファイルを開く。
        With Workbooks.Open(Filename:=strFilePath & strFileName)

            ' ファイル内のシート数を取得する。
            sheetCnt = .Worksheets.Count

            ' ファイル内のシート数分+チェックしたい項目数分の2次元配列を確保する。
            ReDim strArr(1 To sheetCnt + 1, 10)
            
            ' 1シート目からnシート目まで繰り返す。
            Dim i As Long
            For i = 1 To sheetCnt
                strArr(i, 0) = .Worksheets(i).Name
                strArr(i, 1) = .Worksheets(i).Cells(3, 4).Value
                strArr(i, 2) = .Worksheets(i).PageSetup.LeftHeader
                strArr(i, 3) = .Worksheets(i).PageSetup.CenterHeader
                strArr(i, 4) = .Worksheets(i).PageSetup.RightHeader
                strArr(i, 5) = .Worksheets(i).PageSetup.LeftFooter
                strArr(i, 6) = .Worksheets(i).PageSetup.CenterFooter
                strArr(i, 7) = .Worksheets(i).PageSetup.RightFooter
                
                .Worksheets(i).Select
                strArr(i, 8) = ActiveWindow.Zoom
                strArr(i, 9) = ActiveCell.Address
            Next i
            
            ' 保存せずファイルを閉じる。
            .Close SaveChanges:=False
        End With

        ' 配列の1からnまで繰り返す。
        Dim j As Long
        For j = 1 To sheetCnt
            ' 結果シートのセルに各ファイルの各シートの値を設定する。
            Cells(longGyo, 1).Value = strFilePath & strFileName
            Cells(longGyo, 2).Value = strArr(j, 0)
            Cells(longGyo, 3).Value = strArr(j, 1)
            Cells(longGyo, 4).Value = strArr(j, 2)
            Cells(longGyo, 5).Value = strArr(j, 3)
            Cells(longGyo, 6).Value = strArr(j, 4)
            Cells(longGyo, 7).Value = strArr(j, 5)
            Cells(longGyo, 8).Value = strArr(j, 6)
            Cells(longGyo, 9).Value = strArr(j, 7)
            Cells(longGyo, 10).Value = strArr(j, 8)
            Cells(longGyo, 11).Value = strArr(j, 9)
            longGyo = longGyo + 1
        Next j

        ' 次のファイルを取得する。
        strFileName = Dir()
    Loop
        
    ' 画面チラつき防止を解除する。
    Application.ScreenUpdating = True
End Sub

【Excel】全シート分繰り返す

Sub Test()

'
' Test Macro
'
' 全シート分繰り返す。
'
    ' 画面のチラつきの防止設定を行う。
    Application.ScreenUpdating = False

    ' 全シート分繰り返す。
    Dim Sht As Worksheet
    For Each Sht In Worksheets
        ' シートを選択する。
        Sht.Select
        ' 処理を記述する。
        Msg "test"
    Next Sht

    ' 画面のチラつきの防止設定を元に戻す。
    Application.ScreenUpdating = True
End Sub

【Excel】選択セルの行列と選択セルの最終行列

Sub Test()

'
' Test Macro
'
' 行列を求める。
'
    ' 特定のセルを選択する。(i:行、j:列)
    ActiveSheet.Cells(i, j).Select

    ' 選択セルの行求める。
    MsgBox ActiveCell.Row

    ' 選択セルの列を求める。
    MsgBox Activecell.Column

    ' 選択セルの最終行を求める。
    MsgBox ActiveSheet.Cells(i, j).End(xlDown).Row

    ' 選択セルの最終列を求める。
    MsgBox ActiveSheet.Cells(i, j).End(xlToRight).Column

End Sub

【Excel】ショートカット割り当て

Excelで自作マクロの起動をショートカットで行います。

Sub AssignShortCutKey()
'
' AssignShortCutKye Macro
'
' ショートカットを割り当てる。
    
    ' F1:何もしない
    Application.OnKey "{F1}", ""

    ' CTRL+ALT+l:メニューオープン
    Application.OnKey "^%{l}", "MenuOpen"

    ' CTRL+t:カーソルトップ
    Application.OnKey "^{t}", "TopCursor"

    ' CTRL+r:赤い太枠四角線
    Application.OnKey "^{r}", "RedBox"

    ' CTRL+ALT+s:SELECT文作成
    Application.OnKey "^%{s}", "SqlSelectCreateYoko"
End Sub

【Excel】VBAフォーム表示

先ほど作成したVBAフォームはマクロで起動できるようにしておきます。

Sub MenuOpen()
'
' MenuOpen Macro
'
' メニューをオープンします。

    フォーム名.Show (vbModeless)

End Sub

【Excel】VBAフォーム追加

Excelで自作マクロの起動をフォームから行います。
まずはフォームを追加します。

VBAエディタを開き、左メニューの「VBAProject」-「フォーム」で右クリックし、
「挿入」-「ユーザーフォーム」を選択します。
後はボタンをGUIで配置します。
配置後にボタンやラジオ

次に追加したフォームで右クリックし、「コードを表示」を選択し、
コード上でボタンイベントで起動したいマクロを指定します。

Private Sub PageSettingModCall_Click()
    Call PageSetting
End Sub

Private Sub SqlInsertCreateModCall_Click()
    Call SqlInsertCreate
End Sub

【Excel】選択範囲のセル書式変更

選択範囲のセル書式を変更します。

Sub TblColColor()
'
' TblColColor Macro
'
' テーブル名の項目名を色付けします。
'

    '選択範囲を色づけする。
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 13434828
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

    '選択範囲を折り返し表示する。
    With Selection.Interior
        .Pattern = xlSolid
        .PatternColorIndex = xlAutomatic
        .Color = 13434828
        .TintAndShade = 0
        .PatternTintAndShade = 0
    End With

    '選択範囲を太字にする。
    Selection.Font.Bold = True

End Sub

【Excel】横の表定義からSELECT文作成

横向けになっている表定義からSELECT文を作成します。
INSERT文の時とは異なり、sqlplusで実行できるようファイル出力しています。

また、sqlplusでSELECT文を実行するとVARCHAR2、CHARのどちらでもスペース埋めされて
結果が確認し難いので、項目ごとをパイプで結合して出力しています。
この辺sqlplusのオプションで解決出来るようにして欲しいです。
Oracleのカテゴリでも記載しましたが、「SET TRIMSPOOL ON」は行末だけという。

前提条件はコメントに記載の通り。
※DATE型に対するTO_DATEは手動。

Sub SqlSelectCreate()
'
' SqlSelectCreateYoko Macro
'
' テーブル名、項目名からSELECT文を自動生成します。
'
' A1:テーブル名
' A2~C2:項目名(論理名)
' A3~C3:項目名(物理名)
' A4~C4:型
' A5~C5:サイズ
' 上記状態の時にマクロを実行する。(テーブル名、項目名(論理名)、型を利用します。)

    ' SQL文用変数を宣言する。
    Dim sql As String
    Dim sqlSelect As String
    Dim sqlColumn As String
    Dim sqlFrom As String

    sqlSelect = "SELECT "

    Dim i As Long
    Dim MaxCol As Long
    MaxCol = Range("A2").End(xlToRight).Column

    For i = 1 To MaxCol Step 1
        Cells(2, i).Activate
        sqlColumn = sqlColumn & ActiveCell.Value & " || '" & Chr(9) & "' || "
    Next i

    sqlColumn = Left(sqlColumn, Len(sqlColumn) - 10)

    sqlFrom = " FROM " & Cells(1, 1).Value & ";"

    sql = sqlSelect & sqlColumn & sqlFrom

    Open "D:/select_" & Cells(1, 1) & ".sql" For Output As #1
    Print #1, "set autotrace off"
    Print #1, "set echo off"
    Print #1, "set timing on"
    Print #1, "set time off"
    Print #1, "set termout off"
    Print #1, "set feedback 1"
    Print #1, "set colsep '" & Chr(9) & "'"
    Print #1, "set pagesize 30000"
    Print #1, "set linesize 30000"
    Print #1, "set trimspool on"
    Print #1,
    Print #1, "col PLAN_PLUS_EXP Format a200;"
    Print #1,
    Print #1, "spool select_" & Cells(1, 1) & ".log;"
    Print #1,
    Print #1, "prompt ======================"
    Print #1, "prompt; データ取得"
    Print #1, "prompt ======================"
    Print #1, sql
    Print #1,
    Print #1, "set autotrace off"
    Print #1, "spool off;"
    Close #1

End Sub