WebPenguin のすべての投稿

VBA等でのダブルクォーテーションの記述方法

ダブルクォーテーションで括ると文字列を表すが、VBAでダブルクォーテーション自体を記述するのはわかりにくい

ダブルクォーテーションのアスキーコードで記述するのと区別がつきやすい
ダブルクォーテーションは、Chr(34)

アスキーコードで記述しない場合は、””のように2つ続けると”を表す
これを、”で括って文字列として表現するには
”””” のように ”” を”で囲むので、4つ続けることになる
例 文字列内に ” を1つ含む
If Left(lineText, 1) = “””” Then は lineText の先頭が ” かどうかを判定

例 ”””Hello””” は、
“Hello”(ダブルクォーテーションで囲まれた文字列)を表す

アスキーコードを使うと以下のように記述できる VBSでも同様

If Left(lineText, 1) = Chr(34) Then

Chr(34) & “Hello” & Chr(34)

Splitの区切り文字を ”,” に指定したいときは
border = “””,”””
border = Chr(34) & “,” & Chr(34)

VBAでのCSV読み込み方法について

VBAでCSVファイルを読み込む方法には、主に「Line Input」と「クエリ(QueryTableまたはPower Query)」の2つがあります。Copilotでコードを生成する際、プロンプトで明確に指示しないと、どちらの方法が使われるかは自動的に決定されるため、意図しないコードが生成される可能性があります。

■Line Input方式
メリット:

シンプルなCSVファイルの読み込みに特化しており、VBA初心者でも比較的簡単に実装可能。
ファイルの内容を一行ずつ文字列として読み込むため、柔軟なデータ加工が可能。
Excelの標準機能のみで完結するため、外部ツールに依存しない。
デメリット:

大量データの処理には不向きで、処理速度が遅くなる可能性がある。
CSVの構造が複雑な場合、コードも複雑になりがち。
エラー処理やデータ変換のコードを自分で記述する必要がある。
文字コードや区切り文字が固定されている場合、柔軟な対応が難しい。
■クエリ方式(QueryTable / Power Query)
メリット:

大量データの高速処理が可能。
CSVの構造を自動認識し、区切り文字や文字コードも自動判別してくれる。
デメリット:

VBAに不慣れな場合、学習コストがやや高い。
Excelのバージョンによっては使用できない場合がある。
VBAとの連携がLine Input方式に比べて複雑になることがある。
■使い分けのポイント
シンプルなCSVファイルを読み込みたい場合や、VBA初心者で簡単な処理を行いたい場合は、Line Input方式が適しています。
大量データの高速処理や、複雑なデータ変換・加工が必要な場合は、クエリ方式(特にPower Query)が適しています。
Copilotでコードを生成する際には、エラー処理やデータ変換の指示を明確に記述できるため、Line Input方式の方がコードの構造がわかりやすくなる傾向があります。

一方で、クエリ方式はパラメータが複雑ですが、Copilotを活用することでその複雑さを吸収できるため、処理時間や目的に応じて両方の方法を試し、最適な方を採用するのが良いでしょう。

■補足
読み込みながらデータを比較・加工する場合は、Line Input方式の方が柔軟で扱いやすいことが多いです。

エクセルVBAでのCSV読み込み

データに半角のカンマが含まれる可能性がある場合は、データをダブルクォーテーションで囲んで、区切り文字としてカンマが使われる

プロンプトで指示する場合にダブルクォーテーションの指示文自体を””で囲んで文字列指示と認識してしまうことが多いので、下記のように、コード番号で指定すると正しい結果が得らやすい

Splitの区切り文字は、Chr(34) & “,” & Chr(34)
データは Chr(34)で囲まれて、カンマで区切られている
データ内に半角のカンマが含まれている可能性があるので、 Chr(34)で囲んでいる

例(現時点での応答結果で、今後は同じプロンプトでも正しい回答となっていくと思われる)

例 以下のプロンプトの応答結果は誤っていた

エクセルのVBAで、指定したパスにあるCSVファイルをシートへ取り込むコードを作成して
データは、””で囲まれています

結果は、コメントには記載されているものの、実際には下記のように通常のカンマを区切り文字に指定したコードが生成された

‘ ダブルクォーテーションで囲まれたデータを分割
values = Split(CleanCSVLine(lineText), “,”)

下記のように追加で、borderを指定する ”をアスキーコードで指定

split(CleanCSVLine(lineText), “,”)をborder = Chr(34) & “,” & Chr(34)で作成して

結果は、以下のようにレコードの最初と最後の”も正しく取り除く処理コードが生成された

‘ 区切り文字:「”,”」をChr関数で表現
border = Chr(34) & “,” & Chr(34)

‘ 最初と最後の ” を削除
If Left(lineText, 1) = “””” Then lineText = Mid(lineText, 2)
If Right(lineText, 1) = “””” Then lineText = Left(lineText, Len(lineText) – 1)

‘ “,” で分割
values = Split(lineText, border)

エクセルVBA 個人マクロでの注意点

個人マクロへVBAコードを格納して実行する時は、プロンプトに処理対象のブックを指定する


<条件>
VBAコードは、個人マクロから実行します
現在、作業しているアクティブなブックのシートを処理対象にしてください

ブックを明示しないと、ThisWorkBookのコードを生成する
※ThisWorkBookは
マクロがどのブックから実行されても、確実にマクロが含まれるブックを対象に操作する場合に使う
複数のブックを開いている場合に、間違えて別のブックに操作を行わないようにするために利用することが多い

個人マクロに登録したVBAで、ThisWorkBookを指定すると非表示にしているPersonal.xlsbブックが処理対象になってしまう

ThisWorkBook:マクロを実行しているワークブック
ActiveWorkBook:現在表示しているワークブック

例 ThisWorkbook
ThisWorkbook.Worksheets(“Sheet1”).Range(“A1”).Value = “Hello”

例 ActiveWorkbook
ActiveWorkbook.Sheets(“Sheet1”).Range(“A1″).Value = “Hello”

Windows11のメモ帳

VBAでテキストファイルを作成して、データを記入するようなコードを作った時に、このデータを処理する時にエラーが発生した

原因は、Windows11のメモ帳がUTF-8がデフォルトに変わった為で、ANSIで処理する際に不具合が起きた

起動オプションを付けることで解決

shellPath = “notepad.exe /a ”
Shell shellPath, vbNormalFocus

個人マクロ

Personal.xlsb をブック非表示で下記へ格納すると個人マクロが使える
C:\Users\%username%\AppData\Roaming\Microsoft\Excel\XLSTART
通常使うブックはマクロ無効でも、通常の拡張子でもALT+F8で個人マクロを利用できるので、便利

注意点は、生成AIでVBAを作成すると、個人マクロでの利用を指示しておかないと、
ThisWorkbook.Activate
のコードが記述される
これは、マクロ実行中のブックをアクティブにする
これがあると、処理対象が個人マクロのブックになるので、注意

Excel 共有フォルダのハイパーリンク

Excelでネットワークパスフォルダのハイパーリンクを作るといつの間にか、相対パス(¥..¥..など)に変換されて、ファイルの場所を変えると開かなくなる

Excelの内部リンク管理が相対パス仕様の為
ファイルのプロパティでハイパーリンクの基点とする設定をすると良いがファイル毎に設定が必要となるのと、他で相対パスの方がよい場合もあるので注意が必要

対処として、ハイパーリンクを関数で設定することが考えられる
VBAでの通常のリンクコード 相対パスに変換されることがある
ActiveCell.Hyperlinks.Add Anchor:=ActiveCell, Address:=folderPath, TextToDisplay:=linkText

数式でのコード 数式のパラメータとして絶対パスを設定するので変換されない
ActiveCell.Formula = “=HYPERLINK(“”” & folderPath & “””,””” & linkText & “””)”

具体例
Option Explicit
Sub フォルダリンク設定()
Dim WshShell As Object
Dim FSO As Object
Dim FILEPATH As String
Dim PathDrive As String
Dim SelectedFile As String
Dim folderPath As String
Dim linkText As String

Set WshShell = CreateObject(“WScript.Shell”) ‘ファイル操作を行う為のオブジェクト

‘ A1セルから初期フォルダパスを取得
On Error Resume Next
FILEPATH = Workbooks(“Personal.xlsb”).Worksheets(“Sheet1”).Range(“A1”).Value
On Error GoTo 0

If FILEPATH <> “” Then ‘記述されている時は存在チェック
Set FSO = CreateObject(“Scripting.FileSystemObject”)
If Not (FSO.FolderExists(FILEPATH)) Then
MsgBox “指定しているフォルダにアクセスできませんでした” & vbCrLf & vbCrLf & “ツールがあるフォルダを設定します”
FILEPATH = ActiveWorkbook.Path
End If
Set FSO = Nothing
Else
FILEPATH = ActiveWorkbook.Path ‘指定ないときはエクセルブックのフォルダ
End If

If Left(FILEPATH, 2) = “\\” Then ‘ネットワークのとき
WshShell.CurrentDirectory = FILEPATH ‘指定のネットワークフォルダをセット
Else
On Error Resume Next
PathDrive = Left(FILEPATH, 2) ‘chdirコマンドはドライブ指定があるとエラーなので、ドライブと分離
ChDrive PathDrive ‘ローカル時は、カレントドライブを変更
If FILEPATH <> “” Then ‘ルートディレクトリでフォルダ指定がないときには chdirコマンドがエラーとなるから処理をスキップ
ChDir FILEPATH
End If
On Error GoTo 0
End If

‘ファイル選択
SelectedFile = Application.GetOpenFilename(“All Files,*.*”, , “サンプルとなるファイルを選択してください”, , False)

‘キャンセルされた場合
If SelectedFile = “False” Then
MsgBox “ファイルの選択がキャンセルされました。”, vbInformation
Exit Sub
End If

‘フォルダパスを抽出
folderPath = Left(SelectedFile, InStrRev(SelectedFile, “\”) – 1)

‘ 表示するテキスト
linkText = “格納フォルダ”

‘選択したセルにハイパーリンクを設定

On Error Resume Next
ActiveCell.Formula = “=HYPERLINK(“”” & folderPath & “””,””” & linkText & “””)”
On Error GoTo 0

Set WshShell = Nothing

‘MsgBox “ハイパーリンクが作成されました: ” & folderPath, vbInformation

End Sub

Option Explicit
Sub 初期参照フォルダ値設定()

‘ 入力ダイアログを表示し、ユーザーに入力を求める
Dim userInput As Variant
userInput = InputBox(“初期参照フォルダを入力してください”)

‘ キャンセルがクリックされた場合は処理を終了
If userInput = “” Then Exit Sub

Workbooks(“Personal.xlsb”).Worksheets(“Sheet1”).Range(“A1”).Value = userInput

Application.DisplayAlerts = False
Workbooks(“Personal.xlsb”).Save ‘ブック名を指定した上書き保存
Application.DisplayAlerts = True

MsgBox userInput & ” を初期参照フォルダに指定しました”

End Sub

エクセルのVBAでフォルダとファイルの存在チェックと、コマンドの実行

フォルダの存在
Dim FSO As Object
Dim FILEPATH As String
FILEPATH = “C:\Program Files\7-Zip”
Set FSO = CreateObject(“Scripting.FileSystemObject”)
If FSO.FolderExists(FILEPATH) Then
MSGBOX ”OK”
Else
MSGBOX ”NG”
End If
Set FSO = Nothing

ファイルの存在
Dim FSO As Object
Dim FILEPATH As String
FILEPATH = “C:\Program Files\7-Zip\7z.exe”
Set FSO = CreateObject(“Scripting.FileSystemObject”)
If FSO.FileExists(FILEPATH) Then
MSGBOX ”OK”
Else
MSGBOX ”NG”
End If
Set FSO = Nothing

FileExistsでは、半角の空白を含む”C:\Program Files\7-Zip\7z.exe”でチェック

Dim WshShell As Object
Set WshShell = CreateObject(“WScript.Shell”)

s7zPath = “””C:\Program Files\7-Zip\7z.exe”””
strFileName = “解凍するファイル名”
cmdtxt = s7zPath & ” x ” & strFileName & ” -otmp -aoa”
‘-aoa:既存ファイルをすべて上書きします。-oに続けて解凍先フォルダを指定 フルパスでない時は相対となる
Call WshShell.Run(cmdtxt)

cmdtxtに組み込む7z.exeのパスは、”””で”括りを指定しないとProgram Filesに含まれる空白の為、エラーとなるが、FileExistsで同様に記述すると”を含んで判別するので、存在しないと判定されるので注意

Fire TVやSwitch Bot ハブでインターネット接続不良

FireTVで、TVer、NHK+が繋がりにくい、SwitchBotハブでインターネット未接続になることが多い
スマホのLineも不調
パソコンのブラウザでは特に異常はない

無線親機のチャンネルなど設定も変更して、試すも改善しない

ホームゲートウェイ PR-500KIの設定も変更してみるが、改善しない
フィルタリング設定やIPアドレス固定、DNS変更、IPv6切断(IPv6が接続になっている?)

結局、HGWでPPPoEブリッジを有効にしてPPPoE接続を解除、無線親機をブリッジモードからルータ機能に変更してPPPoE接続(IPv6ブリッジ有効-デフォルト)で、改善

HGWの設定をどうすれば改善できたかは不明だが、I/Oデータ製の無線ルータでの接続で解決