つらつら Excel VBA

私の備忘録です。

2014-01-19から1日間の記事一覧

関連付けられたアプリケーションでファイルを開く

Dim WSH As Object Set WSH = CreateObject("WScript.Shell") WSH.Run Chr(34) & FilePath & Chr(34) 'Set WSH = Nothing ※Chr(34)でFilePathを囲む必要がある。Chr34はダブルクォーテーション。 囲まないとファイルパスに空白が含まれていた場合に失敗する…

InStr

VBA

If InStr(1, "C:\nantara\test.xls", "\", vbTextCompare) > 0 Then MsgBox "発見" End If ※1文字目から、比較方法はvbTextCompareで、\を探したら、3文字目でした。 見つからなかった場合は0が返ります。 検索開始場所と比較方法は省略可能。というか省略す…

On Error なんたらエラー処理

VBA

Sub Sample1 On Error GoTo onErr 'エラーが起きるような処理 GoTo onEnd 'Exit Subなど onErr: 'エラー時の処理を記載 Debug.Print Err.Number 'エラー番号 Debug.Print Err.Description 'エラーメッセージ Resume Next 'エラー発生個所に戻る?未検証 onEn…

デバッグ作業

VBEにおいてデバッグでよく使うヤツ [表示]-[ツールバー]-[編集] 主にコメント設定で使用 [表示]-[イミディエイトウィンドウ] Debug.Print の出力ウィンドウ [表示]-[ウォッチウィンドウ] 実行中の変数の中身を確認・編集ができる ショートカットキー [F5] …

ディレクトリ削除(RmDir)

RmDir "C:\FilePath\" ※RmDirはディレクトリ内にファイルがあるとエラーとなる。 ファイルが存在するディレクトリを削除するにはFileSystemObjectを使うようです。

構造体配列

VBA

Option Explicit Public Type FileInfo '構造体の宣言 no As Integer name As String title As String End Type Public FileInfoList(10) As FileInfo '構造体配列の宣言 'こんな感じ(動作未検証) Dim fi As FileInfo fi.no = 1 fi.name = "Name" fi.title…

ファイル数を数える

'指定したディレクトリ内のファイル数を数える。 Public Function FileCount(sDir As String) As Integer Dim rtnCnt As Integer Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") rtnCnt = FSO.GetFolder(sDir).Files.Count Set FS…

自動的に消えるメッセージボックス

VBA

Dim WSH As Object Set WSH = CreateObject("WScript.Shell") WSH.Popup "Message", 2, "Title", vbInformation Set WSH = Nothing ※2秒後に消えます。vbInformationは表示するアイコンです。

ディレクトリの存在確認

Dim tempDir As String tempDir = ThisWorkbook.Path & "\Test\" If Dir(tempDir, vbDirectory) = "" Then MkDir tempDir 'ディレクトリの作成 End If

フォームのモードレス表示

Public Sub UserFormShow() Dim frm As UserForm1 Set frm = New UserForm1 frm.Show vbModeless 'フォームのモードレス表示 End Sub ※たくさん表示できます。収拾がつかなくならないよう注意。追記 モーダルとモードレスは混在不可

ユーザーフォームを数える

'指定した名前のユーザーフォームを数える Function countUserForm(name As String) As Integer Dim cnt As Integer Dim frm As Object cnt = 0 For Each frm In UserForms If UCase(frm.Caption) = UCase(name) Then cnt = cnt + 1 End If Next countUserFo…

ランダム値の生成

VBA

'ランダム値を取得 Function getRandom(i_min As Integer, i_max As Integer) As Integer Dim temp As Integer Dim sa As Integer '差 Randomize '乱数生成ジェネレータ '引数が逆だった場合は入れ替え。 If i_max < i_min Then temp = i_max i_max = i_min …

ディレクトリの再帰検索

'引数1 targetDir 対象ディレクトリパス '引数2 extenstion 対象ファイルの拡張子を指定(例:*.csv) '引数3 recursive サブディレクトリの検索(True:行う, False:行わない) Public Sub FolderSearch(targetDir As String, extension As String, recursive As…

Excelのショートカットキー

よく使う [Ctrl]+[1] セルの書式設定 [Ctrl]+[F2] 印刷プレビュー※2007以降 [Alt]+[F11] VBE表示 [Ctrl]+[PgUp]or[PgDn] 隣のシート表示 [Ctrl]+[上]or[下]or[左]or[右] データが途切れる場所までジャンプ [Ctrl]+[:] 現在時刻 [Ctrl]+[;] 現在日付

Split、LBound、UBound

VBA

Dim ary_ver As Variant, i As Integer ary_ver = Split("123,456,789", ",") For i = LBound(ary_ver) To UBound(ary_ver) '処理 Next

Excelのバージョン取得

Dim ver As Stringver = Application.Version ※「12.0」とか得られるので、文字列で取得する。 ちなみに12.0はExcel2007です。

配列のループ

VBA

For i = LBound(FileList) To UBound(FileList) '処理 Next ※Lboundは配列の最小要素番号、Uboundは配列の最大要素番号を返す。 この方法だとOption Base 1などの影響を受けずに済む。

動的配列とループ処理

VBA

Dim var_list As Variant, cnt As Integer cnt = 0 '配列の要素追加 If cnt = 0 Then ReDim var_list(0) Else ReDim Preserve var_list(UBound(var_list) + 1) End If var_list(UBound(var_list)) = "データ" cnt = cnt + 1 補足 ・ReDim 配列の再定義。例)…

重複なしのリスト作成(ハッシュマップ、連想配列)

VBA

Dim DIC As Object , keys As Object Dim i As Integer, temp as String Set DIC = CreateObject("Scripting.Dictionary") temp = "Test" 'リストに無ければ、リストと配列に追加 If Not DIC.Exists(temp) Then DIC.Add temp, "値" '辞書に追加 End If '確認…

シート名の確認処理

'シート名チェック処理 Function checkSheetName(sheet_name As String) As Boolean Dim i As Integer Dim bln_return As Boolean bln_return = False For i = 1 To ThisWorkbook.Worksheets.Count If ThisWorkbook.Worksheets(i).Name = sheet_name Then bl…

ディレクトリ選択ダイアログ

VBA

'ディレクトリを選択するダイアログを表示。 Dim target_dir As String With Application.FileDialog(msoFileDialogFolderPicker) If .Show = True Then target_dir = .SelectedItems(1) End If End With ※選択されなかったら空文字が返る。 取得されるパス…

画面更新の停止

例) 行や列の追加や削除を頻繁に行う場合に処理の最初と最後に以下を追加すると、すごく良い。 Application.ScreenUpdating = False '停止 Application.ScreenUpdating = True '再開 ※停止した場合は必ず再開させること。

指定時刻にマクロを実行

VBA

Application.OnTime EarliestTime:=(Now + TimeValue("00:00:02")), _ Procedure:="Macro1", _ LatestTime:=(Now + TimeValue("00:01:00")) ※現在時刻の2秒後にMacro1を実行する。他のマクロが実行している場合は実行できないので、1分間は様子を見る。

変数宣言の強制

Option Explicit ※面倒くさがらず、最初に必ず書くこと。

yyyymmddhhMMss + ミリ秒

VBA

'現在の時刻をyyyymmddHHMMSS+ミリ秒で取得 Function getNow() As String getNow = Format(Now, "yyyymmddHHMMSS") & getMSec() End Function 'ミリ秒を取得 Function getMSec() As String Dim dblTimer As Double Dim s_return As String dblTimer = CDbl(T…

処理の待機(Sleep)

標準モジュールに記載 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 使用方法 Sleep 1000 ※1000で1秒。1で0.001秒。

モジュール名について

モジュール名を変更する場合、モジュール内の関数名と同じ名前は付けてはいけない。 Excel保存前は実行できるが、保存後に実行できなくなる。

公開開始

主に備忘録として、つらつら記載していきます。