兎に角よく使う。良く調べるコードのメモ。
最終行、最終列を取得するコード
最終行を取得するコード
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