よく使うコード

 兎に角よく使う。良く調べるコードのメモ。

  1. 最終行、最終列を取得するコード
  2. 処理時短
  3. CSVファイルの取込
  4. CSVファイルの1文字ずつ読み込む
  5. CSVファイルの書き出し
  6. 正規表現を使ってCSVファイルを読み込む

最終行、最終列を取得するコード

最終行を取得するコード
Cells(Rows.Count, 1).End(xlUp).Row
一番下から Ctrl+↑した行番号を返す。1はA列の事。例えばB列にしたければ2にする。
Cellを指定して上から 「Ctrl + ↓」した行番号を返す方法は
Cells(1,1).End(xlDown).Row

最終列を取得するコード
Cells(1,Columns.Count).End(xlToLeft).Column
1行目の一番右のセルから「Ctrl + ←」をした列番号を返す。
Cellを指定して左から「Ctrl + →」をした列番号は
Cells(1,1).End(xlToRight).Column

参考サイト
第18回.最終行の取得(End,Rows.Count)
Excelの神髄
https://excel-ubara.com/excelvba1/EXCELVBA318.html

処理時短

‘画面更新OFF 途中で止まったらイミディエイトウィンドウで直す 
Application.ScreenUpdating = False 
‘ウエイトカーソル カーソルが点滅する時に xlDefaultで戻す
Application.Cursor = xlWait     
‘シートを選んだ時などのイベントを抑止 
Application.EnableEvents = False 
‘シートを消す時に出るメッセージを抑止       
Application.DisplayAlerts = False    
‘ワークシートの計算を止める。 戻すときはxlCalculationAutomatic
Application.Calculation = xlCalculationManual 

参考サイト
マクロVBAの開始時と終了時に指定しておくべきApplicationのプロパティ
Excelの神髄
https://excel-ubara.com/excelvba5/EXCELVBA210.html

CSVファイルの取込

CSVファイルの取込(Line Input)
C\test に以下のようなtestcsv.csvファイルを作ったとする。

Sub CSVデータの取り込み()

  Dim 行 As Long
  Dim 列 As Long
  Dim ファイル番号 As Long
  Dim ファイル名 As String
  Dim 行データ As Variant
  Dim v配列 As Variant
  Dim 配列番号 As Long
  
  行 = 1
  列 = 1
  ファイル番号 = FreeFile 'FreeFile 空き番号を探す関数
  ファイル名 = "C:\test\testcsv.csv"
  
  Open ファイル名 For Input As ファイル番号
  ActiveSheet.Cells(行, 列).Select
  
  
  Do Until EOF(1)
    Line Input #ファイル番号, 行データ
    '行データ = Replace(行データ,"""", "")  ' ダブルクォーテーションの削除
    v配列 = Split(行データ, ",")
    
    列 = 1
     For 配列番号 = 0 To UBound(v配列)
        ActiveSheet.Cells(行, 列).Value = v配列(配列番号)
        列 = 列 + 1
    Next 配列番号
    行 = 行 + 1
  Loop

  Close ファイル番号

End Sub

CSVファイルの1文字ずつ読み込む

 Line Inputはカンマ区切りを途中に使われると区切る位置を間違えてしまう。1文字ずつ読んだ場合でも対応するには1文字ずつ読む方法を使う。
C\test に以下のようなtestcsv2.csvファイルを作ったとする。

Sub CSVデータを1文字ずつ読む()
  
  Dim 行 As Long
  Dim 列 As Long
  Dim ファイル住所 As String
  
  '事前に参照設定で[Microsoft Scripting Runtime]にチェックを入れる
  Dim ムサイ As New FileSystemObject
  Dim ドム As Textstream
  Dim 攻撃 As String
  Dim 連続攻撃 As String
  
  行 = 1
  列 = 1
  ファイル住所 = "C:\test\testcsv2.csv"
  
  Set ドム = ムサイ.OpenTextFile(ファイル住所, ForReading)
  
  Do Until ドム.AtEndOfStream
  
    '一文字ずつ読む
    攻撃 = ドム.Read(1)
    
    '改行ならデータを貼って行を送る
    If 攻撃 = vbCr Then
      '最初と最後の["]を取る
      ActiveSheet.Cells(行, 列) = Mid(連続攻撃, 2, Len(連続攻撃) - 2)
      連続攻撃 = ""
      'Linefeedを避ける
      ドム.Skip (1)
      '次の行データへ準備
      行 = 行 + 1
      列 = 1
    Else
      '文字をつなげる
      連続攻撃 = 連続攻撃 + 攻撃
    End If
    
    ' [",]で区切る
    If 連続攻撃 Like "*""," Then
        ActiveSheet.Cells(行, 列) = Mid(連続攻撃, 2, Len(連続攻撃) - 3)
        連続攻撃 = ""
        列 = 列 + 1
    End If
  
  Loop
  
  ドム.Close
  
  'オブジェクトの開放
  Set ドム = Nothing
 
End Sub

CSVファイルの書き出し

Dim 書き出したいシート名 As String
Dim ファイル名 As String ’フルファイルパス

’このシートだけのExcelファイルを生成して保存→Excelは保存せずに削除
Sheets(書き出したいシート名).Copy 
ActiveWorkbook.SaveAs Filename:=ファイル名 & “.csv”, FileFormat:=xlCSV
ActiveWorkbook.Close SaveChanges:=False
ThisWorkbook Activate

参考サイト
Microsoft
XlFileFormat 列挙体 (Excel)
https://learn.microsoft.com/ja-jp/office/vba/api/excel.xlfileformat

正規表現を使ってCSVファイルを読み込む

1文字ずつ読んでいくほかに正規表現を使う方法もある。おおよそ下記のようになる。ChatGPT3.5を使って作成。
一気にデータを読み込んでいるが、数メガバイトの大きさのファイルならこちらの方が早いらしい。

Sub 正規表現を使ってCSVファイルを読み込む()
    Dim filePath As String
    Dim fileContent As String
    Dim regex As Object
    Dim matches As Object
    Dim match As Variant
    Dim line As Variant
    
    ' CSVファイルのパスを設定する
    filePath = "G:\desktop\test.csv"
    ' ファイルを読み込む
    ' LOF関数・・ファイルのバイト数を返す
    ' Input$(LOF(1),#1) でファイル1の大きさの分だけ、読み込む
    Open filePath For Input As #1
    fileContent = Input$(LOF(1), #1)
    Close #1
    
    ' 正規表現オブジェクトを作成する
    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .Global = True       ' パターンにマッチするすべての個所を検索する
        .IgnoreCase = True   '大文字小文字を区別しない
        '[^,] はカンマ以外の任意の文字
        ' +は1回以上の繰り返し
        .Pattern = "[^,]+" ' ここに正規表現パターンを指定する
    End With
    
    ' ファイル内容を行単位で処理する
    Dim lines() As String
    lines = Split(fileContent, vbCrLf) ' 改行で分割
    
    For Each line In lines
        ' エラーハンドリングで次の行に進む
        On Error Resume Next
        
        ' マッチした部分を取得する
        Set matches = regex.Execute(line)
        
        ' エラーチェック
        If Err.Number <> 0 Then
            Err.Clear ' エラー番号をクリアする
            Debug.Print "この行データにパターンに合うものはありませんでした。次の行を処理します。"
            GoTo 次の行 ' 次の行にジャンプする
        End If
        
        ' エラーハンドリングを元に戻す
        On Error GoTo 0
        
        ' マッチした結果を処理する
        For Each match In matches
            'ダブルクオーテーションをとる
            Debug.Print Replace(match.Value, """", "")
        Next match
        
次の行:
    Next line
    
    ' メモリを解放する
    Set regex = Nothing
End Sub

ちなみにLine Inputを使った方法だと下記のようになる。

Sub 正規表現を使ってCSVファイルを読み込む()
    
    Dim filePath    As String
    Dim fileContent As String
    Dim regex       As Object
    Dim matches     As Object
    Dim match       As Variant
    Dim 行データ    As String
    
    
    ' 正規表現オブジェクトを作成する
    Set regex = CreateObject("VBScript.RegExp")
    With regex
        .Global = True       ' パターンにマッチするすべての個所を検索する
        .IgnoreCase = True   '大文字小文字を区別しない
        '[^,] はカンマ以外の任意の文字
        ' +は1回以上の繰り返し
        .Pattern = "[^,]+" ' ここに正規表現パターンを指定する
    End With
    
    
    ' CSVファイルのパスを設定する
    filePath = "G:\desktop\test.csv"
    ' ファイルを読み込む
    ' LOF関数・・ファイルのバイト数を返す
    ' Input$(LOF(1),#1) でファイル1の大きさの分だけ、読み込む
    Open filePath For Input As #1
    
    ' ファイル内容を行単位で処理する
    
    Do Until EOF(1)

      Line Input #1, 行データ
      
      ' エラーハンドリングで次の行に進む
      On Error Resume Next
      
      ' マッチした部分を取得する
      Set matches = regex.Execute(行データ)
      
      ' エラーチェック
      If Err.Number <> 0 Then
          Err.Clear ' エラー番号をクリアする
          Debug.Print "この行データにパターンに合うものはありませんでした。次の行を処理します。"
          GoTo 次の行 ' 次の行にジャンプする
      End If
      
      ' エラーハンドリングを元に戻す
      On Error GoTo 0
      
      ' マッチした結果を処理する
      For Each match In matches
          'ダブルクオーテーションをとる
          Debug.Print Replace(match.Value, """", "")
      Next match
            
次の行:
      
    Loop
    
    Close #1
    
    ' メモリを解放する
    Set regex = Nothing
End Sub
投稿日:
カテゴリー: VBA

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA