WebPenguin のすべての投稿

サウンド詳細

サウンド詳細設定を呼び出す
「Windowsキー + R」を押して「ファイル名を指定して実行」を開き、「mmsys.cpl」と入力後Enter

デスクトップショートカット
デスクトップで右クリック →「新規作成」→「ショートカット」→「項目の場所」に「mmsys.cpl」と入力して作成

音量ミキサーを開く:「Win + R」で「SndVol」と入力。

設定アプリのサウンドページ:「ms-settings:sound」や「ms-settings:sound-devices」をショートカット化

Outlookのワードラップ(自動折り返しの設定)

Outlookで、長い文字列のネットワークパスなどを送る場合に自動折り返しで途切れてリンクが機能しない時は、オプションで折り返し文字数を最大に変更するとよいのですが、手動設定できる最大が132文字なので、それより長いパスを使いたい時は、レジストリで修正します

“\\server001\————-\\”
Or
<"\\server001\-------------\\>

でサーバフォルダパスリンクを送信する場合
※Office365のバージョン例

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Common\MailSettings]
“PlainWrapLen”=dword:000001f4

VBSで設定
Set WshShell = WScript.CreateObject(“WScript.Shell”)

WshShell.RegWrite “HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Common\MailSettings\PlainWrapLen”,500,”REG_DWORD”

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