excel
デバッグで少々ハマったのでメモ。指定したフォルダの下のファイルを一つずつ取り出して処理する場合や、特定のファイルが存在するかを判断したい場合には、DIR関数で簡潔に記述できるのでよく使用します。こんな感じで Dim path As String Dim file As Stri…
マクロを組んでいて少し悩んだのでメモ テキストファイルを読み書きする際にはFreeFile関数でFileNumberを取得して、ファイルに割り当てて使用するが、以下の様に事前にFileNumberを取得すると書き込み用ファイルのオープンで「ファイルは既に開かれています…
ExcelからODBCドライバをインストールせずにSQLite3へアクセスする方法 準備(64bit環境の場合) Releases · govert/SQLiteForExcel · GitHub からSQLite For Excelの最新版を入手(現時点ではSQLiteForExcel-1.0.zip)しアーカイブの中から、SQLiteForExcel_6…
ExcelからODBC経由でSQLite3へアクセスする方法 準備 SQLite ODBC Driver からSQLite ODBC Driverをダウンロードしてインストールする。64bit版はsqliteodbc_w64.exe(現時点の最新はVer.0.9996) インストールを行うとsqlite3.dllがC:\Windows\System32に見つ…
目的 ListBoxとTextBoxがあるユーザーフォームで、TextBoxに入力したデータをListBoxに追加していきたい。 その時Enter押下だけで連続に入力していく様にしたい。 試行錯誤 通常はTextBoxにデータを入力したあとにEnterを押すとフォーカスが別のコントロール…
2019/3/14追記 現時点のWindows10環境のExcel (Excel for Office365 64bit)で確認したところ、下記で述べている問題は発生しませんでした。Excel側で改善されたようですね。 背景 職場のPCは現在Windows7 Excel2010の環境で統一されていて、そこで以下のよ…
マクロ入りの雛形ファイルをコピーして作成されたExcelファイルが多数ある場合の一括マクロ更新などに使用。 参考サイト:VBAでVBEを操作する 基本的に更新対象ファイルの対象モジュールの内容を一括削除して、予め更新マクロ用Excelファイルに用意した、同…
EXCEL用のCOMオブジェクトを作成して、あとはVBAと同じ感覚で操作できるっぽいです。 一点、配列やコレクションの括弧の形状がVBAだと( )ですが、[ ]にしないとメソッドと間違えられてエラーになるので注意。 $excel = New-Object -ComObject Excel.Applicat…
昨日と逆の変換。 UTF-8バイト列にBOMがなくても変換される模様。 参照:Streamオブジェクト - ADOオブジェクト - MSDN Sub Sample() Dim buf(2) As Byte Dim s As String Dim i As Long buf(0) = &HE3 ' BOMなし buf(1) = &H81 buf(2) = &H82 With CreateOb…
ADODB.Streamオブジェクトにテキストで書き込んで、Typeプロパティをバイナリに変えてByteの配列として読み出す。 なお変換されたUTF-8バイト列にはBOMが付加されている。 参照:Streamオブジェクト - ADOオブジェクト - MSDN Sub Sample() Dim buf() As Byt…
範囲が広い場合にはセルを一つずつ操作するよりも、一旦配列にコピーして操作したほうが速い(らしい)。 Sub sample() Dim r As Range, ra As Range Dim a As Variant Dim i As Long, col As Long, row As Long Set ra = Range("A1:D3") ' 初期値書き込み i…
MyClassオブジェクトのメンバ変数m_dataが5以上になるとOverflowイベントを発生する。 標準モジュールではイベント処理が記述できないので、シートモジュールかユーザーフォームで記述する。 MyClass(クラスモジュール) Private m_data As Long ' Overflow…
マクロが書かれているブックではないブック(エクセルファイル)のオープンやクローズをapplicationのイベントとして検出する。クローズはWorkbooks("hoge").Closeだけでなくて、ウィンドウ右上の×クリックによるクローズも検出できる。 VBEのクラスモジュー…
クリップボードへのアクセスは、DataObjectを介して行う。 またクリップボードが空か否か、どんなデータが入っているかの確認はApplication.ClipboardFormatsを使用する。 データ種別を示す定数の参照先:XlClipboardFormat 列挙 (Excel) - MSDN ' クリップ…
ファイルハンドル?は、#1などと番号を指定しても良いが、FreeFileで空いている番号を取得することもできる。 Sub accessTextFile() Dim fNo As Long Dim fName As String Dim s As String fNo = FreeFile fName = ThisWorkbook.Path & "\sample.txt" ' 1行…
LOFでファイルサイズを取得できる。Get,Put共、第2引数で位置を指定、第3引数のサイズ分だけ読み書きを行う。 読み取り時bufの不足分は0で埋められる。 Sub accessBinFile() Dim fNo As Long Dim fName As String Dim buf(0 To 4) As Byte Dim pos As Long, …
こんなこともできるということで、各DLLにどんな機能が入っているか知ってないと使えませんが。。。 64bitと32bit環境で宣言の仕方が微妙に違うので注意。 参考 キー コード定数 (ActiveX コントロール) - MSDN Option Explicit '64bit PC Private Declare P…
Option Explicit Sub test() On Error GoTo ErrHandler 'エラー発生時のジャンプ先 Dim a As Long a = 1 / 0 ' エラー発生 MsgBox "エラー発生行の次へジャンプしました。" On Error GoTo 0 ' エラー処理の無効化 Exit Sub Label1: MsgBox "Label1へジャンプ…
メンバ変数へのアクセスはプロパティで行う。コンストラクタの引数でメンバ変数へ値を設定することはできない。検索すると裏技で対応方法がいろいろ公開されているが、後々意味が分からなくなりそうなので使用せずプロパティで行うこと。 引数の無いプロシー…
Option Explicit Sub testTimer() Dim sec As Long: sec = 10 ' タイマー時間 Dim targetTime As Date ' 現在時刻 + タイマー時間 targetTime = DateAdd("s", sec, Time) Do ' セルに残り秒数を表示 Range("A1").Value = DateDiff("s", Time, targetTime) Do…
Option Explicit Type MyStruct val As Long str As String End Type Sub foo() Dim a As MyStruct a.val = 10 a.str = "abcd" MsgBox a.val & a.str End Sub
Dim dic As Object Dim d As Variant ' Objectではダメ Set dic = CreateObject("Scripting.Dictionary") dic("a") = "A" ' データ追加 dic.Add "b", "B" ' データ追加、キーが存在した場合はエラー If Not dic.Exists("c") Then ' キーの存在確認 dic.Add "…
配列数式というのを知ったのでメモ。 対象の範囲の演算結果を内部的に配列に格納して計算を行う? で良いのかな? 下記はA1:A10の範囲の値のうち偶数をB列に表示する例。 B1からB5には以下の式が入力されている。Ctrl+Shift+Enterで入力し、式の両側に{ }が…
使用できる正規表現: Pattern プロパティ - VBScript - MSDN Sub foo() Dim re As Object Dim str As String Set re = CreateObject("VBScript.RegExp") str = "apple" With re .Pattern = "ap" '検索パターンを設定 .IgnoreCase = True '大文字と小文字を区…
"文字列" Like "パターン" ? 任意の一文字 * 任意の文字 # 任意の数値 [a-z] a-z内の一文字 [!a-z] a-zに一致しない一文字
制御文 If 条件 Then ElseIf 条件 Then Else End IfFor 変数 = 開始値 To 終了値 Step 間隔 Exit For NextFor Each 変数 in コレクション Exit For NxetDo While/Until 条件 Exit Do LoopDo Exit Do Loop While/Until 条件Select Case 変数 Case 値 Case 値 …
If Range("A9") = Empty Then MsgBox "empty"
MsgBox Chr(65) ' -> "A" MsgBox Asc("A") ' -> 65
Application.ScreenUpdating = False '無効 Application.ScreenUpdating = True '有効
Sub fileSelectDialog() Dim fn As String fn = Application.GetOpenFilename( _ "エクセルファイル(*.xls?),*.xls?" & ",CSVファイル(*.csv),*.csv") If fn <> "False" Then MsgBox fn End If End Sub