Comments
Transcript
複数選択 カレントパス、ファイル・フォルダ検索 ExecuteExcel4Macro
VBA系 2016/7/30 複数選択 Sheets(1).Select Sheets(2).Select (False) Sheets(3).Select (False) カレントパス、ファイル・フォルダ検索 ChDir ThisWorkbook.Path Dim buf$, msg$ buf = Dir("*", vbDirectory) Do While buf <> "" If GetAttr(buf) And vbDirectory Then If buf <> "." And buf <> ".." Then msg = msg + buf + vbCrLf End If buf = Dir() Loop MsgBox msg ExecuteExcel4Macro Cells(i, 1) = ExecuteExcel4Macro("'C:\[Book1.xls]Sheet1'!R" & i & "C1") 閉じているブックの参照 ='D:\aaa\[DB.xlsm]Sh'!B2 オートフィルタ―解除 ActiveSheet.AutoFilterMode = False Chdir、とにかくデスクトップへ、CreateObject Dim Fpath As String Fpath = CreateObject("WScript.Shell").SpecialFolders("Desktop") -1- VBA系 2016/7/30 コマンドバー Sub a() With CommandBars("Cell").Controls.Add(before:=3) .Caption = "Label" .OnAction = "M_name" .State = True .Tag = "Temp" .FaceId = 481 .BeginGroup = True End With End Sub For Each c In CommandBars("Cell").Controls 'CommandBars("Cell").Reset VBA実行ショートカット作成 Sub a() Application.MacroOptions Macro:="Mname", ShortcutKey:="j" End Sub Sub Sampl6() Application.OnKey "{F3}", "Sample1" End Sub OnKeyメソッドで設定したショートカットキー解除 Sub Sampl6() Application.OnKey "{F3}" End Sub Application.OnKey "^j" 数式 Alt % Shift + Ctrl ^ MsgBox Cells(1, 1).FormulaLocal 図形タイプ検索 Sub Sample() Dim c As Object For Each c In ActiveSheet.Shapes MsgBox TypeName(c.DrawingObject) Next c .type=1 End Sub .typename(~ =OLEobject -2- メール送信 VBA系 2016/7/30 Sub a() With CreateObject("outlook.application") With .createitem(olmailitem) .Recipients.Add("[email protected]").Type = 1 .Recipients.Add("[email protected]").Type = 2 '' CC" .Recipients.Add("[email protected]").Type = 3 ''BCC" .Subject = "件名" .bodyformat = 1 .body = "本文" .attachments.Add "D:\aaa\k13.jpg" .send End With End With End Sub レジストリ Sub Regedit_insert() SaveSetting "ApplicationName", "SectionName", _ "KeyName3", "DataName3" End Sub Sub Regedit_call() Dim buf As String buf = GetSetting("ApplicationName", "SectionName", _ KeyName, "存在しません") MsgBox buf End Sub Sub AllSection_Call() '' 二次元配列でレジストリ取得 Dim tmp As Variant, i As Byte tmp = GetAllSettings("applicationname", "sectionname") For i = 0 To 1 MsgBox tmp(i, 0) & vbCrLf & tmp(i, 1) Next i End Sub Sub Regedit_Delete() DeleteSetting "Applicationname", "Sectionname", "Keyname" End Sub -3- フォームでのレジストリ使用 Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) VBA系 2016/7/30 SaveSetting "Mymacro", "Form", "Top", Top SaveSetting "Mymacro", "Form", "Left", Left SaveSetting "Mymacro", "Form", "Text", TextBox1.Text If OptionButton1 = True Then _ SaveSetting "Mymacro", "Form", "Option", OptionButton1.Caption If OptionButton1 = False Then _ SaveSetting "Mymacro", "Form", "Option", OptionButton2.Caption End Sub Private Sub UserForm_Initialize() startupposition = 0 Dim pos As Long, buf As String pos = Val(GetSetting("Mymacro", "Form", "Top", "100")) Me.Top = pos pos = Val(GetSetting("Mymacro", "Form", "Left", "100")) Me.Left = pos buf = GetSetting("Mymacro", "Form", "Text") TextBox1.Text = buf buf = GetSetting("Mymacro", "Form", "Option", "") If buf = OptionButton1.Caption Then OptionButton1 = True buf = GetSetting("Mymacro", "Form", "Option", OptionButton2.Caption) If buf = OptionButton2.Caption Then OptionButton2 = True End Sub グラフ挿入 With ActiveSheet.ChartObjects.Add(30, 50, 300, 200).Chart .ChartType = xlColumnClustered .SetSourceData Source:=Range("A1:B3") End With 列系3のグラフ色変更 With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points(3) .Interior.ColorIndex = 5 End With -4- 列系の中から、1,000 以上の値のグラフ色変更 VBA系 2016/7/30 Dim tmp As Variant, I As Long tmp = ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Values For I = 1 To UBound(tmp) If tmp(I) >= 1000 Then With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points(I) .Interior.ColorIndex = 6 End With End If Next I Shell 関数 Call Shell("EXCEL D:\予算.xlsm", 1) Call Shell("winword D\京.docx", 1) ウィンドウサイズ ActiveWindow.Width = 300 ActiveWindow.Height = 300 1セル文字列、複数文字列へ分割 CLEAN(MID(SUBSTITUTE(A$1,CHAR(32),REP T(CHAR(9),99)),ROW(C1)*99-98,99)) aa aa bb cc ⇒ bb cc 図形選択、セル番地 If c.TopLeftCell.Address = "$B$12" Then c.Select OLE Objects Dim Obj As OLEObject For Each Obj In ActiveSheet.OLEObjects If Obj.Name Like "TextBox*" Then Obj.Object.Value = "" ElseIf Obj.Name Like "CheckBox*" Then Obj.Object.Value = False End If Next -5- VBA系 2016/7/30 コメント Sub a() Application.DisplayCommentIndicator = 1 With Cells(1, 1) .AddComment.Shape.Fill.UserPicture "c:\\ayu.jpg" .Comment.Shape.Select With Selection .Text = "京都" .ShapeRange.LockAspectRatio = msoTrue .ShapeRange.Fill.Transparency = 0.6 .ShapeRange.Width = 200 End With End With Application.DisplayCommentIndicator = -1 End Sub ウィンドウ、最大・最少 Application.WindowState = xlMinimized Application.WindowState = xlMaximized テキストファイル取込 ActiveSheet.QueryTables.Add("Text;" & N, _ Range("A1")).Refresh BackgroundQuery:=0 【優位性】①utf8などキャラ指定可, ②列削除可, ③列を文字列指定でゼロ落ち可 ④シングルQ or ダブルQ or 無し 指定可, ⑤開始行指定可能 ⑥区切り文字列指定可能(カンマ以外にタブも可) .TextFileColumnDataTypes = Array(1, 2, 5, 9) ⇒ (標準, 文字列, 日付, 削除) ユーザーネーム Cells(1, 1) = Application.UserName ユーザー名 MsgBox CreateObject("WScript.Network").UserName 連続範囲最終列 MsgBox Range("B2").CurrentRegion.Columns.Count あくまで選択範囲のカラム数 リピート MsgBox String(10, "*") -6- VBA系 2016/7/30 ピボット範囲変更 ActiveWorkbook.Names.Add Name:="pv範囲", RefersToR1C1:= _ =OFFSET(元データ!R2C2,,,COUNTA(元データ!C1),3) pv.SourceData = Range("hoge").Address(True, True, xlR1C1, True) フォーム上、フォームコントロール追加 Dim s As Integer Dim myCheckBox As Control For s = 1 To Sheets.Count Set myCheckBox = Me.Controls.Add("Forms.CheckBox.1") With myCheckBox .Height = 20 .Width = 132 .Left = 10 .Top = (s - 1) * .Height + 10 .Caption = Sheets(s).Name End With Next s 画像複製 Set px = ActiveSheet.Pictures(1).Duplicate 同シート内に限る フォーム、OLEコントロール ActiveSheet.DrawingObjects("ListBox1").ListFillRange = "Sheet1!A1:A10" アクティベイト AppActivate "Sample.txt - メモ帳", True AppActivate "Microsoft Excel", True B = ActiveWindow.Caption DoEvents AppActivate B, True R1C1 ⇔ A1 R[-3]C[-7]:R[1]C[-5] Range("A1") = Application.ConvertFormula("A1:C5", xlA1, xlR1C1) Range("A2") = Application.ConvertFormula("R2C3", xlR1C1, xlA1) $C$2 -7- VBA系 2016/7/30 ファイルシステム With ActiveWorkbook ' タイトル Cells(1, 2).Value = .BuiltinDocumentProperties("Title").Value ' サブタイトル Cells(2, 2).Value = .BuiltinDocumentProperties("Subject").Value ' 作成者 Cells(3, 2).Value = .BuiltinDocumentProperties("Author").Value ' 管理者 Cells(4, 2).Value = .BuiltinDocumentProperties("Manager").Value ' 会社名 Cells(5, 2).Value = .BuiltinDocumentProperties("Company").Value ' 分類 Cells(6, 2).Value = .BuiltinDocumentProperties("Category").Value ' キーワード Cells(7, 2).Value = .BuiltinDocumentProperties("Keywords").Value ' コメント Cells(8, 2).Value = .BuiltinDocumentProperties("Comments").Value ' ハイパーリンクの起点 Cells(9, 2).Value = .BuiltinDocumentProperties("Hyperlink base").Value ' 作成日時 Cells(10, 2).Value = .BuiltinDocumentProperties("Creation date").Value ' 更新日時 Cells(11, 2).Value = .BuiltinDocumentProperties("Last save time").Value ' 更新者 Cells(12, 2).Value = .BuiltinDocumentProperties("Last author").Value End With タイマー Dim s_time, e_time MsgBox "OKをおしてください" s_time = Timer e_time = Timer MsgBox "マクロスタートからOKを押すまでの時間は " & e_time - s_time & " 秒でした" Autfilter 日付複数選択 xlSh.Range("B3").AutoFilter 2, Operator:=xlFilterValues _ , Criteria1:=Array(#1/2/2015#, #1/13/2015#, "2015/1/5") ●Operator:=xlFilterValuesは必須 日付は#Jan/1# など入力するとVBEで自動変換される ◆条件を満たすレコード数 = フィルタ抽出後のセル数をSpecialcells-Visible からカウント -8- VBA系 2016/7/30 Evaluate メソッド MsgBox Evaluate("SUM(A1:A3)") MsgBox [SUM(A1:A3)] MsgBox WorksheetFunction.Sum(Range("A1:A3")) MsgBox [a1+a2] ボタンコントロール追加 With ActiveSheet.Buttons.Add(80, 50, 0, 0) .OnAction = "VBA_Name" .Characters.Text = "テキスト" .Characters.Font.Size = 14 .Characters.Font.Color = RGB(255, 255, 255) .AutoSize = True End With 2007で複数シートピボット ActiveWorkbook.PivotCaches.Create(xlConsolidation, _ Array("Sheet1!R1C1:R6C3", "Sheet2!R1C1:R6C3"), 3) _ .CreatePivotTable "R1C1" 圧縮 ZipF = Path & "CSV1.zip" With CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipF) .Write "PK" & Chr(5) & Chr(6) & String(18, 0) .Close End With CreateObject("Shell.Application").Namespace(ZipF).CopyHere Path & "CSV1.csv" CreateObject("Shell.Application").Namespace(ZipF).CopyHere Path & "CSV2.csv" 解凍 With CreateObject("Shell.Application") .Namespace(PathTo & "\").CopyHere .Namespace(【.zip】フルネーム).Items End With zipフォルダ内が複数ファイルでも可能 Shell で開く Dim WSH Set WSH = CreateObject("Wscript.Shell") WSH.Run "C:\My Documents\Sample.txt", 3 Set WSH = Nothing -9- VBA系 2016/7/30 フォルダを開く Shell "C:\Windows\Explorer.exe " & Path, 1 ピボットの集計行を削除 For Each PvtFld In .PivotFields PvtFld.Subtotals(1) = False Next PvtFld コピーファイル、フォルダ FSO.CopyFile "C:\test\*.bmp", "C:\test\hoge\", False ファイル名にワイルドカート可能 第三引数にFalse指定で上書き無し、エラー扱い ファイル・フォルダの存在確認 Debug.Print FSO.FileExists("C:\test\test.txt") 理論値で 拡張子付ファイル名・拡張子無しファイル名 Debug.Print FSO.GetParentFolderName("C:\Sample1.xlsm") Debug.Print FSO.GetBaseName("C:\test\001.bmp") Debug.Print FSO.GetExtensionName("C:\test\001.bmp") 上段は'C:\' フォルダパス 中段は'001' ファイル名(拡張子無し) 下段は'bmp' ファイル拡張子 ファイルタイプ MsgBox FSO.GetFile("C:\Sample1.xlsm").Type Microsoft Office Excel マクロ有効ワークシート 画像の保存 SavePicture UserForm1.Image1.Picture, "C:\Users\test.bmp" Reset ステートメント Openで開いているももの全てを閉じる。単純【Reset】の1行のみ - 10 - VBA系 2016/7/30 エクスプローラー操作 Dim WND As Object Dim W As Object Set WND = CreateObject("Shell.Application") For Each W In WND.Windows MsgBox TypeName(W) & Chr(13) & _ W.FullName & Chr(13) & W.LocationURL If Right$(W.FullName, 12) = "iexplorer.exe" Then MsgBox "ie" W.Navigate "File:///c:\" W.Navigate "yahoo.co.jp" W.Quit Next W フィルタ関数 v = Filter(Ar, "A", True, 0) Filter(sourcearray,match[,include[,compare]]) 一次配列【Ar】から、第二引数【A】を『含む』 『含む』の判断は第三引数IncludeのTrue、省略可能 └ True = 含む, False = 含まない ⇒ Like演算子ではない └ ワイルドカート不可 第四引数Compare は、テキスト比較=0、バイナリ比較=1 省略可能 複数回数センドキー SendKeys "{UP 5}" 上キーを5回 他ブックマクロ実行 Set xlBK = GetObject(CurrentProject.Path & "\MyFunc2.xlsm") xlBK.Application.Run "xlFunc", "kyouto" AccessからExcelモジュール実行可能, 第一引数=Module名, 第二以降は引数 モジュール名(引数) As String などのように返し型モジュールでも実行可 プライベート系は不可 書式検索 Application.FindFormat.Interior.Color = vbRed Set R = Cells.Find("", ActiveSheet.UsedRange.SpecialCells(11), _ SearchDirection:=xlPrevious, SearchFormat:=True) SearchDirection xlNext : xlPrevious - 11 - VBA系 2016/7/30 表示機能 ActiveWindow.DisplayGridlines = False 枠線 ActiveWindow.DisplayHeadings = False 見出し Application.DisplayFormulaBar = False 数式バー Application.DisplayFullScreen = True 全画面 別窓IE処理 Dim WithEvents IE As InternetExplorer Dim IE2 As InternetExplorer '/******* フォームシートイベント *************/ Private Sub IE_NewWindow2(ppDisp As Object, Cancel As Boolean) Set IE2 = CreateObject("InternetExplorer.Application") Set ppDisp = IE2 End Sub '/******* フォームシートイベント *************/ 実行アプリ一覧、AppActivate用 Sub Sample1() Dim WD, task, n As Long Set WD = CreateObject("Word.Application") For Each task In WD.Tasks If task.Visible = True Then ''Wordを起動します ''Word VBAのTasksコレクションを調べます ''タスク(プロセス)が実行中だったら n=n+1 Cells(n, 1) = task.Name ''タスクの名前を書き出します End If Next WD.Quit Set WD = Nothing End Sub 印刷タイトル With ActiveSheet.PageSetup .PrintTitleRows = "$1:$2" .PrintTitleColumns = "$A:$A" End With - 12 - VBA系 2016/7/30 印刷範囲設定・解除、プリントプレビュー ActiveSheet.PageSetup.PrintArea = _ Range("B2").CurrentRegion.Address ActiveSheet.PageSetup.PrintArea = "" ActiveSheet.PrintPreview 印刷ヘッダー、フッター設定 ActiveSheet.PageSetup.CenterHeader = ActiveSheet.Name ActiveSheet.PageSetup.LeftFooter = Range("A1").Value 印刷中央寄せ ActiveSheet.PageSetup.CenterHorizontally = True ActiveSheet.PageSetup.CenterVertically = True 改ページ位置取得 ActiveSheet.HPageBreaks(1).Location.Select 2ページ目の先頭行左位置 ActiveSheet.HPageBreaks(2).Location.Select 3ページ目の先頭行左位置 HPageBreaks ⇔ VPageBreaks (VPageBreaks.Countなど) ページ位置、フッターへ ( 現在ページ / 総ページ ) ActiveSheet.PageSetup.CenterFooter = _ "&F (" & n & "/" & myWSCnt & "ページ)" テーブルスタイル・集計行 ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight15" ActiveSheet.ListObjects(1).TableStyle = "TableStyleLight16" ActiveSheet.ListObjects(1).ShowTotals = True xlSh.ListObjects("tbl").TableStyle = "TableStyleLight15" xlSh.PivotTables("pv").TableStyle2 = "PivotStyleLight22" 挿入写真の縦横比 c.ScaleHeight 1, msoTrue c.ScaleWidth 1, msoTrue - 13 - シェイプ図形操作、角度・影まとめ VBA系 2016/7/30 Set Sh = ActiveSheet.Shapes.AddShape(21, 50, 50, 120, 100) Sh.IncrementRotation 30 '回転角度 'Rotation=絶対 IncrementRotation=相対 Sh.TextFrame.Characters.Text = "AAA" Sh.TextFrame.Characters.Font.Size = 20 Sh.TextFrame.Characters.Font.Color = vbGreen Sh.Line.ForeColor.RGB = vbRed Sh.Fill.Visible = False Sh.ThreeD.Depth = 20 ' 奥行きの設定 Sh.ThreeD.SetExtrusionDirection msoExtrusionTopLeft '奥行方向 Sh.ThreeD.ExtrusionColor.RGB = vbCyan '3Dの色を設定 Sh.ThreeD.Visible = True 'ShadowFormatの取得 Sh.Shadow.OffsetX = 30 '水平方向 Sh.Shadow.OffsetY = -30 '垂直方向 Sh.Shadow.ForeColor.RGB = vbBlue '影の塗りつぶし Sh.Shadow.Transparency = 0.5 '透明度 Sh.Shadow.Obscured = True 'True=面,False=線 Sh.Shadow.Visible = True 配列数式、特定の文字を含むものだけ順取得 INDEX($C:$C,SMALL(INDEX(NOT(ISNUMBER(FIND("E",$B$1:$B$100)))* (NOT(ISNUMBER(FIND("D",$B$1:$B$100))))*10^5+ ROW($B$1:$B$100),),ROW(A1))) 図形倍率 ActiveSheet.Shapes(1).LockAspectRatio = msoFalse ActiveSheet.Shapes(1).Height = 50# ActiveSheet.Shapes(1).Width = 150# ActiveSheet.Shapes(1).LockAspectRatio = msoFalse ActiveSheet.Shapes(1).ScaleWidth 2!, False ActiveSheet.Shapes(1).ScaleHeight 0.5!, False 重複削除、RemoveDupulicates の第二引数は Header - 14 - VBA系 2016/7/30 リストボックス For i = 0 To Me.ListBox1.ListCount - 1 If Me.ListBox1.Selected(i) = True Then 'MsgBox Me.ListBox1.List(i) For i = 0 To objIE.document.Links.Length - 1 'イミディエイトウィンドウに表示 Debug.Print objIE.document.Links(i).href WORDなど外部Office操作 Dim Word As New Word.Application Word.Visible = True Word.Documents.Open "C:\word.docx" Word.Selection.TypeText Text:="あ" IEサイズ変更、ズーム IE.ExecWB 63, 0, CLng(80) 選択条件書式、セレクション =OR(CELL("col")=COLUMN(),CELL("row")=ROW()) ブックイベントセレクションチェンジへ Application.ScreenUpdating = True 範囲名の削除 ActiveWorkbook.Names("rng").Delete 赤塗りつぶしフィルター Range("A1").AutoFilter 1, vbRed, Operator:=xlFilterCellColor '8 リストオブジェクト、テーブル Set Lst = ActiveSheet.ListObjects.Add(xlSrcRange, _ Range("CA1").CurrentRegion, , xlYes) - 15 - VBA系 2016/7/30 開いているアクセスを GetObject から操作 Sub Sample() Dim Ac As New Access.Application Do 通常GetObjectも可能 Set ac = GetObject("D:\Work\MyFunc\MyFunc.accdb") On Error GoTo En Set Ac = GetObject(, "Access.Application") MsgBox Ac.CurrentDb.Name If Ac.CurrentProject.Name = "130704_.accdb" Then MsgBox "Find!", 64 Call AcFun(Ac) End If Ac.Quit On Error GoTo 0 Loop En: MsgBox "Finish", 64 End Sub Function AcFun(Ac As Access.Application) Ac.DoCmd.OpenTable "T1" End Function コメント追加 Application.DisplayCommentIndicator = xlCommentAndIndicator With R.AddComment("AAA") .Shape.TextFrame.Characters.Font.Size = 13 .Shape.Fill.ForeColor.SchemeColor = 5 .Shape.Fill.Transparency = 0.05 .Shape.Line.Weight = 1 .Shape.Line.ForeColor.SchemeColor = 2 .Shape.TextFrame.AutoSize = True End With IE_リンク IE.Document.Links(0).Click - 16 - VBA系 2016/7/30 グラフタイトル With ActiveSheet.ChartObjects(1).Chart .HasTitle = True '---グラフタイトル表示 .ChartTitle.Text = "9月度売上" '---タイトル文字列設定 .ChartTitle.Left = 0 .ChartTitle.Top = 100 End With グラフプロットエリア ActiveSheet.ChartObjects(1).Chart.PlotArea.Fill.UserPicture Pic 散布図、折れ線マーカー色 With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1) v = .Values For i = 1 To UBound(v) With .Points(i) .MarkerBackgroundColor = RGB(255, 0, 0) .MarkerForegroundColor = RGB(255, 0, 0) End With Next i End With 項目軸・値軸書式設定 With ActiveSheet.ChartObjects(1).Chart .Axes(xlCategory).TickLabels.Font.Size = 15 .Axes(xlValue).TickLabels.Font.Size = 15 .Axes(xlValue).TickLabels.Font.Color = 255 .Axes(xlValue).TickLabels.NumberFormatLocal = "0""円""" End With 散布図、X,Y軸設定 With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1) .Values = Range("B3:B5") 'Y_値 .XValues = Range("C3:C5") 'X_カテゴリ End With - 17 - VBA系 2016/7/30 Source data range MsgBox ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Formula 列系追加 ActiveSheet.ChartObjects(1).Chart _ .SeriesCollection.Add Range("C1:C10") データラベル表示 With ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points For i = 5 To .Count Step 5 With .Item(i) .HasDataLabel = True 'dataラベル表示 .DataLabel.Interior.Color = 255 '色指定 .DataLabel.Font.Size = 15 'Fontサイズ変更 End With Next i End With 値軸最大値・最小値 .Axes(xlValue).MinimumScale = WorksheetFunction.Max(Columns(2)) .Axes(xlCategory).MinimumScale = WorksheetFunction.Min(Columns(3)) Value2 プロパティでシリアル値 MsgBox Range("A1").Value2 配列範囲の選択 Ar(0) = "B1" Ar(1) = "B4" Ar(3) = "$C$8" Range(Join(Ar, ",")).Select Instr (1, 2, 3, 4) = (Start, String1, String2, Comp) 第一引数は省略可能 MsgBox InStr(3, "上京下京中京", "京") MsgBox InStr("上京下京中京", "京") - 18 - VBA系 2016/7/30 Intersect Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("B2:C5")) Is Nothing Then MsgBox "B2:C5" Resize MsgBox Range("B2").Resize(3, 1).Address = "B2:B4" = Resize(3) MsgBox Range("B2").Resize(3, 2).Address = "B2:C4" 画面位置 ActiveWindow.ScrollRow = 30 ActiveWindow.ScrollColumn = 30 Application.Goto Reference:=Range("C20"), Scroll:=True 複数セル選択 Union(Range("A2:B4"), Range("C2:D3"), Range("F:F")).Select Set Rng = Range("B2:C3") Set Rng = Union(Rng, Columns(5)) Rng.Select セルの数式空白 If Range("B1") = "" Then MsgBox "空白" If IsEmpty(Range("B1")) Then MsgBox "Empty" 数式空白含まず チェンジイベント、Undo Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Count > 1 Then MsgBox "Exclusion" Application.EnableEvents = False Application.Undo Application.EnableEvents = True ◆ Undo × 2 ⇒ 再度 SpecialCells Cells.SpecialCells(xlCellTypeFormulas).Select Cells.SpecialCells(xlCellTypeFormulas, 2).Select 1=数値, 2=文字列, 3=数値 and 文字列 Cells.SpecialCells(xlCellTypeBlanks).Select - 19 - VBA系 2016/7/30 数式非表示 Cells.SpecialCells(xlCellTypeFormulas).FormulaHidden = True ActiveSheet.Protect 複数セル範囲エリア Set Rng = Range("A1:B2, C1:D3, F3:F10") Rng.Areas(2).Select MsgBox Rng.Areas.Count 特定セル内変換 Application.FindFormat.Interior.Color = vbYellow Range("A:A").Replace _ What:="京", _ Replacement:="◆", _ LookAt:=xlPart, _ MatchCase:=True, _ MatchByte:=True, _ SearchFormat:=True ペースト加算 Columns("C:C").PasteSpecial Paste:=xlValues, Operation:=xlAdd セル挿入で選択セル不変 Range("C2").Select Selection.Insert xlShiftDown ⇒ 挿入後選択セルはC2 セル範囲の開始・終了行列 開始行 MsgBox Rng.Row 終了行 MsgBox Rng.Rows(Rng.Rows.Count).Row 開始列 MsgBox Rng.Column 終了列 MsgBox Rng.Columns(Rng.Columns.Count).Column セル範囲 Rng.Name = "烏丸御池" Rng.Name = ActiveSheet.Name & "!烏丸御池" Range("烏丸御池").Select ActiveWorkbook.Names("烏丸御池").Delete MsgBox Names("四条烏丸").RefersToLocal = セル名範囲 - 20 - VBA系 2016/7/30 セルロック Range("A1").Locked = False セル範囲内指定、Intersect Intersect(Range("E2,D5,G7").EntireRow, _ Range("E1").CurrentRegion).Interior.Color = vbYellow MsgBox ActiveCell.Next タブキーでの移動、Protect 中でも同様、逆は Previous 数式かどうか MsgBox ActiveCell.HasFormula MsgBox ActiveCell.HasArray = 配列数式時 ActiveCell.FormulaArray = ActiveCell.Formula Array数式修正 コメントセル判定 MsgBox TypeName(ActiveCell.Comment) "Comment" or "Nothing" 連続範囲数 MsgBox Selection.Areas.Count Selection.Areas(2).Select セル範囲(Range() )の中身は255文字まで セル範囲の格納 Set Rng = Union(Rng, R) 他アプリ操作 Dim Wd As New Word.Application For Each c In Wd.Tasks If c.Name Like "Microsoft Access*" Then c.Close Next c 非アクティブシートのセルを選択 Application.Goto Sheets("Sheet2").Range("B3") 漢字判定 Case Is >= "亜" - 21 - VBA系 2016/7/30 幅狭セル For Each Rng In Selection If IsError(Rng) Then MsgBox "Error!", , Rng.Address Else If Rng.Value <> Rng.Text And _ Left(Rng.Text, 1) = "#" Then MsgBox "Column Shrink", , Rng.Address End If End If Next Rng ◆###記号は数値セルのみ セルに目印 ActiveCell.ID = "kyouto" ブックを閉じるまで、非保存 セル絶対参照変換 ConvertFormula(Formula, FromReferenceStyle, ToReferenceStyle, ToAbsolute, RelativeTo) R = Application.ConvertFormula(R.Formula, xlA1, xlA1, xlAbsolute) R = Application.ConvertFormula(R.Formula, 1, 1, 2) ◆第三引数 xlAbsolute 1 $A$1 xlAbsRowRelColumn 2 A$1 xlRelRowAbsColumn 3 $A1 xlRelative 4 A1 数式中の全参照セル MsgBox ActiveCell.DirectPrecedents.Address ⇒ アクティブシートのみ Vlook範囲含む 特定セルのセル幅を基準に列全体 Autofit ActiveCell.Columns.AutoFit ActiveCell.EntireColumns.AutoFit └ Row は不可 Autofill ActiveCell.AutoFill Destination:=ActiveCell.Resize(3) ActiveCell.AutoFill Range("I3:K3") - 22 - VBA系 2016/7/30 共通セル範囲 Range("B2:C10 A3:D3").Select スペース指定 セルのふりがな設定 ActiveCell.Characters(1, 2).PhoneticCharacters = "Pho" 選択範囲数 MsgBox Selection.Count MsgBox Selection.Areas(1).Count 列アルファベット n = 222 Str = Cells(1, n).Address(True, False) MsgBox Left(Str, InStr(Str, "$") - 1) コメント追加 If TypeName(ActiveCell.Comment) = "Nothing" Then ActiveCell.AddComment.Text "Comment" コメント表示 Range("A5").Comment.Visible = False Address Address( RowAscolute, ColumnAbsolute, xlReferenceStyle, External MsgBox ActiveCell.Address(True, True, xlR1C1, True) └ External ⇒ '[BookName]'Sh!A1 複数ふりがな取得 Str = Application.GetPhonetic("都") Do While Str <> "" MsgBox Str Str = Application.GetPhonetic() Loop 選択セル外枠 Selection.BorderAround True, xlMedium ◆第二引数以降は省略可能 リストボックスリンク ActiveSheet.Lst1.LinkedCell = "A3" - 23 - ふりがな設定・Visible VBA系 2016/7/30 With Range("A1").Phonetic .CharacterType = xlHiragana .Visible = True .Font.Size = 12 End With ブック・シート・セル同時移動 Application.Goto "[BK.xlsm]Sheet1!R1C5" 乱数=Int((最大値 - 最小値 +1 ) * Rnd + 最小値) 重複の無い乱数値の設定 Dim n As Long Const Max = 12 Const Min = 3 Dim ArBln(Min To Max) As Boolean Randomize For i = Min To Max Do n = Int((Max - Min + 1) * Rnd + Min) Loop Until ArBln(n) = False Cells(i - Min + 1, 1) = n ArBln(n) = True Next i セル結合 Selection.Merge 選択シート数 ActiveWindow.SelectedSheets.Count 濁音判定 Str = Range("A1").Phonetic.Text Str = StrConv(Str, vbKatakana) If Len(Str) < Len(StrConv(Str, vbNarrow)) Then MsgBox "濁音" └ 濁音は半角では1文字 チャートセリエ色 Chart.SeriesCollection(i).Format.Fill.ForeColor.RGB = vbRed - 24 - 線シャープ挿入 VBA系 2016/7/30 StartR = 2 EndR = 10 With Range(Cells(StartR, "A"), Cells(EndR, "A")) L = .Left + (.Width) / 2 H = .Top + .Height Set c = ActiveSheet.Lines.Add(L, .Top, L, H) c.Border.Color = vbRed c.Border.Weight = 3 End With ハイパーリンク (Anchor, Address, SubAddress, ScreenTip, TexttoDisplay) Range("A1").Hyperlinks.Add _ Anchor:=Range("A1"), _ Address:="C:\BK.xlsm", _ SubAddress:="T1!A1", _ ScreenTip:="カーソル時", _ TextToDisplay:="セル文字" ピボットページエリアフィルタクリア、マルチ設定 pv.PivotFields("都道府県").ClearAllFilters pv.PivotFields("都道府県").EnableMultiplePageItems = True ピボットページエリア For i = 0 To ActiveSheet.都道府県.ListCount - 1 If ActiveSheet.都道府県.Selected(i) = False Then _ pv.PivotFields("都道府県") _ .PivotItems(ActiveSheet.都道府県.List(i)).Visible = False Next ページエリアの中身 For Each c In pv.PivotFields("都道府県").PivotItems MsgBox c Next c IE Form, Item検索 For Each c In IE.Document.Forms.Item For Each c In IE.Document.Forms - 25 - VBA系 2016/7/30 横棒、縦軸最上段のみデータラベル k = Chart.SeriesCollection(i).Points.Count Chart.SeriesCollection(i).Points(k).ApplyDataLabels Chart.SeriesCollection(i).Points(k).DataLabel.ShowValue = False Chart.SeriesCollection(i).Points(k).DataLabel.ShowCategoryName = False Chart.SeriesCollection(i).Points(k).DataLabel.ShowSeriesName = True IE, Frame操作 Dim FrameC As FramesCollection Dim HtmlD As HTMLDocument Set FrameC = IE.Document.Frames Set HtmlD = FrameC(1).Document Stop '★0スタート Frame(30,70) の30ががゼロ、70が1 HtmlD.all.Zipradio.Checked = True HtmlD.all.btnOk.Click For Each c In HtmlD.getElementsByTagName("input") マーカーまとめ Dim P As Point Set P = ActiveSheet.ChartObjects(1).Chart.SeriesCollection(1).Points(1) P.MarkerStyle = xlMarkerStyleCircle 'xlMarkerStyleCircle 丸 'xlMarkerStyleDash 横長長方形 'xlMarkerStyleDiamond ひし形 'xlMarkerStyleNone マーカー無 P.Format.ThreeD.BevelTopType = msoBevelSoftRound P.MarkerBackgroundColor = vbRed 'マーカー色 P.Format.Line.ForeColor.RGB = vbBlack 'マーカー線 P.Format.Line.Weight = 0.01 'マーカー線太さ P.Format.Line.Transparency = 0.25 P.Format.Fill.Transparency = 0.9 P.MarkerSize = 50 P.HasDataLabel = True '透過性 'マーカーサイズ 'データラベル P.DataLabel.ShowSeriesName = True P.DataLabel.ShowValue = True P.DataLabel.ShowCategoryName = True P.DataLabel.AutoText = True '系列名 'Y値 'X値 'オートテキスト - 26 - 'P.DataLabel.Characters(1, 1).Font.Color = vbRed VBA系 2016/7/30 P.DataLabel.Format.Fill.ForeColor.RGB = vbYellow P.DataLabel.HorizontalAlignment = xlLeft P.DataLabel.Separator = Space(3) P.DataLabel.Position = xlLabelPositionAbove '上 P.DataLabel.Position = xlLabelPositionBelow '下 P.DataLabel.Position = xlLabelPositionCenter '中央 P.DataLabel.Position = xlLabelPositionLeft '左 IE IE.ExecWB 17, 0 'セレクトオール IE.ExecWB 18, 0 'クリアセレクト ピボット行列位置移動 pv.PivotFields("F1").PivotItems("B").Position = 3 ソート的な表示順 【パワポマクロ開始】 スライド選択 ActivePresentation.Slides(2).Select 図形選択 ActivePresentation.Slides(2).Shapes("Txt1").Select 図形へテキスト ActivePresentation.Slides(2).Shapes("Txt1").TextFrame.TextRange.Characters.Text = "京都" 選択図形の一括位置調整 For Each c In ActiveWindow.Selection.ShapeRange c.Left = 300 Next c シェイプペースト PPre.Slides(2).Shapes.Paste Set Sp = PPre.Slides(2).Shapes(PPre.Slides(2).Shapes.Count) 【パワポマクロ終了】 - 27 - VBA系 2016/7/30 選択範囲で中央 Range("A1:A3").Select Selection.HorizontalAlignment = xlCenterAcrossSelection セル選択確認 If TypeName(Range) Then If TypeName(Selection) = "Picture" Then ゼロを非表示 ActiveWindow.DisplayZeros = False 複数セル編集判定 If Target.Count > 1 Then シートイベントの "Target" はアクティブセルではなく Selection エリア Range("A1:A2,C5:D6,E2:G3").Select MsgBox Selection.Areas(2).Address HTML改行 style="width: 70px;border: 1px solid #000;word-break: break-all;" 行ごとの一括行挿入 Range("2:2,4:4,5:5").Insert xlShiftDown ⇒ 各列にそれぞれ1行追加、2行目の次、4行目の次 セレクトケースの To 条件 Case "あ" To "ん" セルの目印に Rng.ID 使用、ブックを閉じると消える Application.ConvertFormula ①xlA1 ⇒ xlR1C1, ②相対 ⇔ 絶対参照 MsgBox Application.ConvertFormula(Selection.Address, xlA1, xlA1, xlRelative) xlAbsolute, xlAbsRowRelColumn, xlRelRowAbsColumn, xlRelative - 28 - VBA系 2016/7/30 セル範囲まとめ Range("A1:B10 A3:F3").Select 2範囲の交差範囲 Range("A1", "B3").Select A1 ~ B3 Resize利用のセルの値移動 With Selection Range("G1").Resize(.Rows.Count, .Columns.Count).Value = .Value End With ユニーク値の作り方 For i = 1 To 10 Do '乱数=Int((最大値 - 最小値 +1 ) * Rnd + 最小値) myNum = Int((10 - 1 + 1) * Rnd + 1) Loop Until myFlag(myNum) = False Cells(i, 1).Value = myNum myFlag(myNum) = True Next i ハイパーリンク Set Hlink = Range("B1").Hyperlinks.Add( _ Anchor:=Range("B2") _ , Address:=ThisWorkbook.FullName _ , SubAddress:="Sheet2!B2" _ , ScreenTip:="ScreenTip") Hlink.TextToDisplay = "texttodisplay" Hlink.SubAddress = "Sheet2!B2" 行列 ジャンプからの相違範囲 Set Rng = Range("C1:C20") Set Rng = Rng.ColumnDifferences(Range("C7")) Rng.Interior.Color = vbYellow ジャンプ ⇒ セル選択 ⇒ アクティブ[行 | 列] との相違 ⇒ 判定は数式ベース(not 値) 行の場合 ⇒ Rng.RowDifferences(Range("C7")) (セル範囲).ColumnDifferences(基準値の1セル) └ (セル範囲)中の値で、基準値の1セル値と異なるセル群, (セル範囲) は×数式, 要値 - 29 - VBA系 2016/7/30 チェックボックス With ActiveSheet.CK1 .Accelerator = "a" 'Altキーと同時に (Only Excel) .Alignment = 1 '0 ⇒ ボタンがテキストの右側に (Only Excel) .Picture = LoadPicture("C:\Red.jpg") 'フォーム同 (Only Excel) .TripleState = True 'Null, True, False MsgBox .Value End With 'チェック切替えは Value を True or False へ オプションボタン With ActiveSheet.Op1 .Accelerator = "a" 'Altキーと同時に (Only Excel) .Alignment = 1 '0 ⇒ ボタンがテキストの右側に (Only Excel) .GroupName = "G1" 'グループ化 UF同 (Only Excel) End With ●以下アクセス Fm.Op1.Value = True '切換え = Access Fm.F1.Value = 0 'F1 = フレームオブジェ名 Fm.F1.Value = 1 '0=無し, 1=Op1, 2=Op2 Selected Fm.F1.Value = 2 プログレスバー With ActiveSheet.Progr1 .Max = 100 .Min = 10 .Value = 30 .Shadow = True'(Only Excel) .Left = 30 MsgBox .TopLeftCell.Address'(Only Excel) End With テキストボックス リンク ActiveSheet.OLEObjects("Txt1").LinkedCell = "Sheet1!E2" セル ⇔ OLEテキストボックス Dim c As OLEObject Set c = ActiveSheet.OLEObjects("Txt1") - 30 - VBA系 2016/7/30 カレンダー FM2.Calendar1.Year = 2010 FM2.Calendar1.Month = 12 FM2.Calendar1.Day = 13 'FM2.Calendar1.Today FM2.Calendar1.DayLength = 3 '0=水曜日, 1=水, 2=Wendnesday, 3=Wed FM2.Calendar1.MonthLength = 3 '0=12月, 1=12, 2=December, 3=Dec '値出力 Private Sub Calendar1_Click() Range("E2") = Me.Calendar1.Value 'テキストボックス KeyDown を使用した年月日変動 'コントロール名 = Calendar1 の前提 'アクセスでもコードは全く同じだた1行目 Private ~ が相違 Private Sub TextBox1_KeyDown( _ ByVal KeyCode As MSForms.ReturnInteger, _ ByVal Shift As Integer) If KeyCode <> vbKeyUp _ And KeyCode <> vbKeyDown _ And KeyCode <> vbKeyLeft _ And KeyCode <> vbKeyRight Then Exit Sub Dim D As Long D = Me.Calendar1.Day Select Case KeyCode Case vbKeyUp Me.Calendar1.Year = Me.Calendar1.Year + 1 Case vbKeyDown Me.Calendar1.Year = Me.Calendar1.Year - 1 Case vbKeyRight Me.Calendar1.Month = Me.Calendar1.Month + 1 Case vbKeyLeft Me.Calendar1.Month = Me.Calendar1.Month - 1 End Select Me.Calendar1.Day = D End Sub - 31 - マルチページ VBA系 2016/7/30 【クラスモジュール】 '/*************************************************************/ Public WithEvents Cmd0 As MSForms.CommandButton Public WithEvents Txt0 As MSForms.TextBox Public WithEvents Lbl0 As MSForms.Label Public WithEvents Lst0 As MSForms.ListBox Public WithEvents Tgl1 As MSForms.ToggleButton '/*************************************************************/ Private Sub Txt_Change() Me.Lbl.Caption = Me.Txt.Value End Sub '/*************************************************************/ Private Sub Tgl1_Click() If Tgl1 = True Then Me.Tgl1.BackColor = vbCyan Me.Tgl1.Caption = Me.Tgl1.Value Else Me.Tgl1.BackColor = vbYellow Me.Tgl1.Caption = Me.Tgl1.Value End If End Sub 【標準モジュール】 モジュール[CTRL_Set]でクラスモジュール間をセット モジュール[DropClass]で解放 モジュール[OLEobj_Sample]は標準モジュールからのサンプル クリック操作は上記クラスモジュール内で Dim Cls As New Class2 '/*************************************************************/ Sub CTRL_Set() '大前提セット With Sheets("OLE").OLEObjects("Mlti1").Object.Pages("Cap1") Set Cls.Cmd0 = .Controls("Btn1") Set Cls.Txt0 = .Controls("Txt1") Set Cls.Lbl0 = .Controls("Lbl1") Set Cls.Lst0 = .Controls("Lst1") End With - 32 - VBA系 2016/7/30 Set Cls.Tgl1 = _ Sheets("OLE").OLEObjects("Mlti1").Object _ .Pages("Cap2").Controls("Tgl1") MsgBox "Finish!", 64 End Sub '/*************************************************************/ Sub OLEobj_Sample() '標準モジュールからのマルチ操作 Dim Sh As Worksheet Set Sh = Sheets("OLE") '●マルチページについて Dim OLEm As OLEObject Set OLEm = Sh.OLEObjects("Mlti1") OLEm.Left = 30 '左 他トップ,幅, 高さ OLEm.Shadow = True '影 'MsgBox OLEm.TopLeftCell.Address 'トップレフトセル 'OLEm.Visible = Not OLEm.Visible 'マルチオブジェ全体の表示 '●マルチページオブジェクト Dim M As MSForms.MultiPage Set M = Sh.OLEObjects("Mlti1").Object '●ページについて Dim P As MSForms.Page 'ページからのインテリ用 Set P = Sh.OLEObjects("Mlti1").Object.Pages("Cap1") P.Caption = "Cap1" 'タグ表示 P.Name = "Cap1" 'コントロール名 P.Index = 0 'タグボタン位置, 0開始 P.Zoom = 100 'ズーム(絶対, not 相対) └ ページはゼロスタート ⇒ Pages(0) ⇒ 一番左のページ '●内部コントロール Dim Lst1 As MSForms.ListBox Set Lst1 = Sh.OLEObjects("Mlti1").Object.Pages("Cap1").Controls("Lst1") - 33 - VBA系 2016/7/30 Dim Ar(2, 1) As String Ar(0, 0) = "0-0": Ar(0, 1) = "0-1" Ar(1, 0) = "1-0": Ar(1, 1) = "1-1" Lst1.List = Ar 'リスト配列セット Lst1.ColumnCount = 2 'カラムカウント Lst1.BoundColumn = 2 'バウンドカラム Lst1.ColumnWidths = "1.5cm;1.5cm" '列幅 Lst1.AddItem "2-0,2-1" '追加 MsgBox Nz(Lst1.Value, "") '選択値 リストボックス リストへバリアント型2次配列可能 DoEvents MsgBox "Finish!", 64 End Sub '/*************************************************************/ Sub DropClass() 'シートマルチ解放 Set Cls = Nothing End Sub ◆ページ変更 cls.Multi1.Value = 3 - 34 - VBA系 2016/7/30 コンボとリストボックス リスト参考 With Me.Lst1 .RowSource = "" 'ソース排除 .RowSource = "B5:C10" 'ソース .ColumnCount = 2 'カラム数 .BoundColumn = 2 'バウンドカラム .ColumnWidths = "2cm;2cm" '列幅 .ColumnHeads = True .MultiSelect = 1 '先頭行 'マルチセレクト .ControlTipText = "AAA" .ControlSource = "A1" .ListStyle = 1 .Font.Size = 12 'ヒントテキスト 'リンクセル 'チェック付 'フォントサイズ End With - 35 - VBA系 2016/7/30 ピボットいろいろ Scl1Name = フィールド名 'スライサー追加 Set Slc1 = ActiveWorkbook.SlicerCaches.Add(pv, Slc1Name) _ .Slicers.Add(ActiveSheet, , Slc1Name, Slc1Name, L, T, 100, 200) CtrolName Caption オブジェ名, キャプ名は自由に命名 スライサー高さ, 色や位置, キャプション Slc1.RowHeight = 15 行高 Slc1.ColumnWidth = 80 カラム幅 Slc1.Style = "SlicerStyleLight2" スタイル Slc1.Top = 10 高さ Slc1.Left = 30 左 Slc1.Caption = "AAA" キャプション Slc1.NumberOfColumns = 2 カラム数 Slc1.SlicerCache.SlicerItems("滋賀県").Selected = False 選択 'ピボット作成 Const pvName As String = "pv" Const DestiPv As String = "E2" Const SourceRng As String = "A50:C60" Const FromSheet = "Sheet1" Const ToSheet = "Sheet2" Set pv = ActiveWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase, _ SourceData:=Sheets(FromSheet).Range(SourceRng)).CreatePivotTable( _ TableDestination:=Sheets(ToSheet).Range(DestiPv), TableName:=pvName) '前年同日日など --- 日付グループ設定後条件 Dim pvf As PivotField pvf = pv.PivotFields("_Num1") pvf.Calculation = xlPercentOf pvf.BaseField = "年" pvf.NumberFormat = "0.0% " グループ Data型 pvF.DataRange(1, 1).Group _ Periods:=Array(False, False, False, True, True, True, True) pv.PivotFields("月").Orientation = Empty (Empty = xlHidden) - 36 - VBA系 2016/7/30 '数値型 pv.PivotFields("Num1").LabelRange.Offset(1).Ungroup pv.PivotFields("Num1").LabelRange.Offset(1).Group Start:=1000, End:=1300, By:=200 pv.PivotFields("Num1").PivotItems("=1000").Visible = False 'ページフィールド pv.PivotFields("地区").ClearAllFilters '全表示 pv.PivotFields("地区").EnableMultiplePageItems = True '複数選択 pv.PivotFields("地区").PivotItems("京都").Visible = True '特定選択 'ピボットいろいろ pv.TableStyle2 = "PivotStyleLight22" 'スタイル pv.ShowTableStyleRowStripes = True '行ストライプ pv.ShowDrillIndicators = False 'ドリル表示 pv.MergeLabels = True 'ラベル結合 pv.RowAxisLayout xlTabularRow '表形式 pv.RepeatAllLabels xlRepeatLabels '繰返し表示 pv.ColumnGrand = False pv.RowGrand = False '列合計表示 '行合計表示 pv.PivotFields("合計 / F2").LabelRange.Offset(1).Sort Order1:=1 '並び替え Set pv = ActiveSheet.PivotTables(1) Set pvf = pv.PivotFields("合計 / F2") pvf.DataRange(1, 1).Sort Order1:=2 ↓ 以下は不可なので、1度 pvf に格納。 pv.PivotFields("合計 / F2").DataRange(1, 1).Sort Order1:=1 'データ通常追加 pv.AddDataField pv.PivotFields("Num1"), "見出し", xlSum pv.AddFields _ RowFields:=Array("地区", "季節"), _ ColumnFields:="Date", _ PageFields:="Str" 'ピボット範囲変更 Set Rng = Range("A50:D100") pv.ChangePivotCache ActiveWorkbook.PivotCaches.Create(xlDatabase, Rng) - 37 - VBA系 2016/7/30 '数式フィールド追加 pv.CalculatedFields.Add _ Name:="CalcField", _ Formula:="=Num1 / 10", _ UseStandardFormula:=True '単発オリエンテーション pv.PivotFields("CalcField").Orientation = xlDataField 'ピボットオプション pv.PivotFields("CalcField").Caption = "AAA" 'pvリスト キャプション pv.PivotFields("合計 / CalcField").Caption = "aaa" 'pv上キャプション pv.PivotFields("aaa").Calculation = xlPercentOfColumn '基準値比率 pv.PivotFields("aaa").NumberFormat = "0.0% " pv.PivotFields("AAA").Delete 'フォーマット '削除はリスト名で データ開始セル pv.DataBodyRange(1, 1).Address pv.DataBodyRange(1, 1).Address pvf.DataRange(1, 1).Address 範囲変数のシート名 (単純なパレント利用) Set Rng = Sheets("Sheet1").Range("B2:C3") MsgBox Rng.Parent.Name VBEで CTRL + Tab でモジュール切替え - 38 - VBA系 2016/7/30 不一致クエリ Select * From A Where Not Exists( Select * From B Where A.企業ID = B.企業ID) ◆acで Exists 可能 Select A.* From A Left Join B On A.企業ID = B.企業ID Where B.企業ID Is Null Select * From A Except 演算子 Except Select * From B (ac不可, 左外部不一致クエリ) Select 企業id, num From A 右はA, B Except 反転 Select 企業id, num From B オペランドの左のクエリでは返されるが、右のクエリでは返されない個別の値を返します └ オペランド = 演算の対象となる値や変数, 被演算子 └ 「A+10」という式では、「A」と「10」がオペランドで、「+」がオペレータ Intersect 演算子 (ac不可, 全列内部クエリ) Select 企業id, num From A Intersect 反転は関係無し Select 企業id, num From B オペランドの左右両方のクエリによって返される個別の値を返します Exリストボックス Dim Lst1 As MSForms.ListBox Set Lst1 = Sh.OLEObjects("Lst1").Object Column(列, 行) Lst1.Column(0, 0) = F1 Lst1.Column(0, 1) = A1 Lst1.Column(0, 2) = A2 Lst1.Column(1, 2) = 11 For i = 0 To Lst1.ListCount - 1 Lst1.Selected(i) = 理論値 Exアドレス引数 ①RowAbsolute, ②ColumnAbsolute, ③ReferenceStyle, ④External, ⑤RelativeTo ①②理論値 ⇒ $A$1, ③xlA1 or xlR1C1, ④理論値 ⇒ [Book1]Sheet1!A1, ⑤相対参照 - 39 - VBA系 2016/7/30 Cn 開いているか Cn.State adStateClosed 0 【既定値】オブジェクトが閉じていることを示します。 adStateOpen 1 オブジェクトが開いていることを示します。 adStateConnecting 2 オブジェクトが接続中であることを示します。 adStateExecuting 4 オブジェクトがコマンドを実行中であることを示します。 adStateFetching 8 オブジェクトの行を取得中であることを示します。 アクセス クエリ追加 Cn.Open CnStrAc Set Rs = Cn.Execute("Create View Q1 As Select * From T1;") Set Rs = Cn.Execute("Drop View Q1") Set DB = CreateObject("DAO.DBEngine.120").Workspaces(0) _ .OpenDatabase("C:\Users\Takehiro Yamada\Desktop\Test\0807\DB.accdb") DB.CreateQueryDef "Q1", "Select * From T1" DB.Close Cn.Open CnStrAc Cat.ActiveConnection = Cn Cmd.CommandText = "Select * From T1" Cat.Views.Append "Q1", Cmd Cn.Close 【Ac通常手動クエリで in 'パス' 操作可】 └テーブル作成も可 アクセステーブルをエクセルシートへエクスポート Cn.Execute "Select * Into [Sheet1] In '"D:Sample.xlsx' 'Excel 8.0;' From Table1;" (xlシート名に$ダラー不要, 新シートは存在していないこと, ブックは必ずクローズ済) (ac通常クエリ手動操作からでも in 'パス' 指定で可能) エクセルシートをアクセステーブルへインポート SQL = "Select * Into T1 From [Sh1$A1:C3] In 'D:\Book1.xlsm' 'Excel 8.0;'" アクセスから空エクセル利用(GetObject以外の操作) Dim Ex As New Excel.Application Ex.Visible = True Ex.Workbooks.Add DAOのアクセスレコードセットをエクセルに CopyFromRecordset 可能 - 40 - VBA系 2016/7/30 アプリフォーカス FindWindow, SetForegroundWindow のAPI利用 myHwnd = FindWindow("OMain", vbNullString) If myHwnd = 0 Then MsgBox "Nothing!", 64 Else SetForegroundWindow myHwnd 'フォーカス End If アクセスインポート、保存済みインポート方法の実行 DoCmd.RunSavedImportExport "保存済みインポート方法" アクセス・エクセルボタンにマクロセット Forms!F1.Btn.OnClick = "=aaa()" ActiveSheet.Shapes("ab").OnAction = "aaa" (ex ActiveX Controlsは不可) アクセス、閉じるときに最適化標準設定 レコードセットから型取得 Rs(i).Type ADO, DAO 共に可能 【定数取得、テーブルから】 DB.TableDefs("ALLData") _ .Fields("コードAAA").Type (色々指定sqlからのRsからType 取得可能, 戻り値は⇒整数) ピボット範囲変更 pv.SourceData = Sheets("Sheet1").Range("A1:D7").Address(True, True, xlR1C1, True) - 41 - VBA系 2016/7/30 ピボットデータフィールドを非表示 For Each c In pv.DataFields c.Orientation = xlHidden ' pv.PivotFields(c.Name).Orientation = xlHidden Next c 検索ボックス 基本は部分一致 ?ワイルド(1文字)可能 完全一致はダブルクォートくくり 1回前保存のバックアップ 同フォルダにバックアップファイル作成 (ファイル保存時のツール⇒全般オプション) ADODB.Stream .State 開いているか(1)、閉じているか(0) TypeName(value)="String" '文字列型かどうか IE D.Title IE.statusText = "京都" D.bgColor = "Cyan" (単純に ドキュメントの bgColor = だけで可) D.characterSet D.cookie D.domain D.GetElementByID sなし D.GetElementsBy ClassName Name TagName TagNameNS D.Images(2).Src D.LastModified - 42 - VBA系 2016/7/30 アクセスクロス集計のテーブル化 SQL = _ テーブル化後を通常Rsとして再利用可 "Select * Into NewTable " & _ 次の親セレクトは新フィール "From [TransForm Count(Num) Select Txt " & _ ド名はブラケットでくくるか "From T1 Group By Txt Pivot kDate " & _ 別名を付与した方が安全 "In (#2014/03/03#, '2014/02/02')]. As T" '◆パーレンではなくブラケット '◆最後の.は必須 '◆サブクエリ名も必須 アクセスクエリ作成 Create View As ViewName As 純選択クエリ Create Procedure As ProcName As それ以外のクエリ ADOX.Catalog から回す時も同様 Dim objView As Procedure objview.Command.CommandText └ Cat.Procedures から、SQL内容取得 アクセスクロス集計条件可能 TransForm IIF(IsNull(Count(F1)), 999, Count(F1)) ADO, 強制テキスト扱い ;Extended Properties="Excel 8.0;HDR=②; [IMEX=1;]"; アクセスロールバック Dim Wsp As DAO.Workspace Set Wsp = DBEngine.Workspaces(0) Wsp.BeginTrans CurrentDb.Execute "Update T1 Set Txt = 'BBB' Where Num = 12;" Wsp.CommitTrans 'Wsp.Rollback ※ ○CurrentDb.Execute, ×Docmd.RunSQL ADO処理実行数 Connection.Execute CommandText [, RecordsAffected] [, Options] RecordsAffected に数値型変数をセット、その変数に処理レコード数が返る ADO, エクセル範囲指定インサート Cn.Execute "Insert Into [Sheet5$B1:D20](f2, f3) Values('z1', 'zz1');", ReCnt Hdr=No, 上記の場合C列に追加(B列から数えて2列目) - 43 - ADO, エクセルなど、カンマ区切りは文字列扱い VBA系 2016/7/30 Vnt = Array("'aa'", "'bb'") Cn.Execute "Insert Into [Sheet5$B1:D20](f2, f3) Values(" & Join(Vnt, ",") & ");", ReCnt ADOでアクセスクエリSQL取得 Cat.ActiveConnection = Cn For Each Proc In Cat.Procedures MsgBox Proc.Command.CommandText アクセスステータスバー Application.SysCmd acSysCmdSetStatus, "京都吉祥院" Application.SysCmd acSysCmdClearStatus - 44 - VBA系 2016/7/30 WorkSpaces DBEngine.CreateWorkspace(Name, User Name, PassWord, [Type] Set Wsp = DBEngine.CreateWorkspace("", "Admin", "") Set DB = Wsp.OpenDatabase(CurrentProject.Path & "\DB2.accdb", False, False) Wsp.BeginTrans SQL = "Create Table T2(F1 Counter(1) Primary Key, F2 Long Not Null)" DB.Execute SQL, dbFailOnError Wsp.CommitTrans Dim Ac As New Access.Application 'Wsp.Rollback Dim DB As DAO.Database Wsp.Close Dim Wsp As DAO.Workspace Set Wsp = Nothing: Set DB = Nothing Ac.OpenCurrentDatabase CurrentProject.Path & "\DB2.accdb", False Ac.Visible = True: Ac.Quit acQuitSaveNone: Set Ac = Nothing 【Acから他のAc操作可能】 ⇒ OpenDatabase(Name{fullPath}, Options{排斥=規定False}, ReadOnly{規定=False}, Connect{接続文字}) DAOからのSQL, Option DB.Execute SQL, Option Option = dbFailOnError ⇒ エラー時ロールバック (定数は128) エクセルピボット For Each pvi In pv.PivotFields("Prefec").PivotItems pvi.RecordCount pvi.Visible MsgBox pvf.EnableMultiplePageItems ページエリアでない場合はFalse, 選択していなくてもエラーにならない MsgBox pv.PivotFields("合計 / 4月").Orientation ⇒ 4 = DataField MsgBox pv.PivotFields("4月").Orientation ⇒ エラー pv.AddDataField pv.PivotFields("4月"), "4月合計", xlSum ⇒ OK pv.AddDataField pv.PivotFields("4月"), "4月", xlSum ⇒ 重複フィールド名エラー pvf.Function = xlAverage '-4106 pvf.Function = xlMax '-4136 pvf.Function = xlCount '-4112 pvf.Function = xlSum '-4157 pvf.Function = xlCountNums '-4113 pvf.Function = xlProduct '-4149 pv.DataFields("データの個数 / 5月").Function ⇒ 実際にはインデックス数値利用 pv.DataFields.Count For Each pvf In pv.DataFields - 45 - VBA系 2016/7/30 グラフ詳細 Set Ct = ActiveSheet.ChartObjects(1).Chart Set Se = Ct.SeriesCollection Set P = Se(1).Points(1) '線のスタイルのみ Se(i).Border.Weight = xlThick '3pt Se(i).Border.Weight = xlHairline '0.25pt Se(i).Border.Weight = xlMedium '2pt Se(i).Border.Weight = xlThin '1pt Se(i).MarkerStyle = xlMarkerStyleStar Se(i).MarkerSize = 10 Se(i).MarkerBackgroundColor = vbRed Se(i).MarkerForegroundColor = vbWhite Se(i).Format.Line.Weight = 5 Se(i).Format.Line.ForeColor.RGB = vbBlue Se(i).Format.Line.BackColor.RGB = vbGreen P.MarkerStyle = xlMarkerStyleDiamond P.MarkerSize = 15 P.MarkerBackgroundColor = vbRed P.MarkerForegroundColor = vbCyan P.Format.Line.Weight = 5 P.Format.Line.ForeColor.RGB = vbBlue P.Format.Line.BackColor.RGB = vbGreen ADODB.Streamからのテキスト取得 'objADOS.Charset = "shift-jis" objADOS.Charset = "UTF-8" objADOS.Open objADOS.LoadFromFile Path & "TestA.csv" objADOS.Position = 0 Open Path & "Result.csv" For Output As #1 Print #1, objADOS.ReadText Close #1 objADOS.Close Set objADOS = Nothing - 46 - VBA系 2016/7/30 Exエラー範囲合計 =SUMIF(A1:A10,"<"&10^10) シェイプペースト PPre.Slides(2).Shapes.Paste Set Sp = PPre.Slides(2).Shapes(PPre.Slides(2).Shapes.Count) リボン最小化 If Application.CommandBars.GetPressedMso("MinimizeRibbon") = False Then _ Application.CommandBars.ExecuteMso "MinimizeRibbon" Ac, Ex, PP 共に可能 パワーポイントの横ペイン表示設定 Dim ppPAry(0) As PowerPoint.Presentation Set ppPAry(0) = GetObject(ThisWorkbook.Path & "\VBA.pptm") ppPAry(0).Application.Visible = msoTrue ppPAry(0).Windows(1).Activate ppPAry(0).Windows(1).ViewType = ppViewSlide 非表示 ppPAry(0).Windows(1).ViewType = ppViewNormal ノーマル表示 └ 定数は整数 Ex図形挿入と図形操作 Set xlSp = xlSh.Shapes.AddPicture( _ Filename:=P & ".jpg", _ LinkToFile:=msoTrue, _ SaveWithDocument:=msoFalse, _ Left:=Range("B2").Left, _ Top:=Range("B2").Top, _ Width:=20, _ Height:=20) xlSh.ShapexlSp.SelectAll xlSp.LockAspectRatio = msoTrue Selection.Group xlSp.Height = 100 Set xlSp = xlSh.Shapes(xlSh.ShapexlSp.Count) xlSp.Cut xlSp.Name = "Group1" Range("B3").PasteSpecial xlSp.Cut Range("C2").PasteSpecial 【ピクチャ又はOLEオブジェ】 xlSp.ScaleHeight 1, msoTrue Factor(第一引数)= 倍率浮動小数 xlSp.ScaleWidth 2.5, msoTrue RelativeToOriginalSize(第二引数)= 対オリジナルサイズ - 47 - Acモジュールの実行 exは開いていれば実行可能 Dim Ac As New Access.Application VBA系 2016/7/30 xlApp.Run 又は xlBK.Application.Run Ac.OpenCurrentDatabase P, False 第二引数はモジュール名のみ(非パス) Ac.Visible = True Ac.Run "GetTime" なおステップイン可 Ac.Run "GetTime2", "京都" Sub GetTime() Function GetTime2(Str As String) MsgBox Now MsgBox Str & vbNewLine & Now End Sub End Function Private Function は不可 DoCmd.RunMacroはオブジェクト一覧にある「マクロ」を実行するためのもの Ex=xlBK.Application.Run "SampleFuncStr", "京都" AcDB自体の作成 Dim Cn As New ADODB.Connection Dim Cat As New ADOX.Catalog Dim ExecCnt As Long Dim CnStr As String CnStr = "Provider=Microsoft.Ace.OLEDB.12.0;Data Source=" CnStr = CnStr & D:\Test.accdb" Cat.Create CnStr Set Cn = Cat.ActiveConnection Cn.Execute "Create Table T1(F1 Long, F2 Counter(1));", ExecCnt Cn.Execute "Insert Into T1(F1) Values(10);", ExecCnt Set Cn = Nothing Acコントロール移動 Me.List1.Move Left, Top, Width, Height Twip指定 ⇒ 1cm = 567 1Inch = 1440twip = 2.54cm ⇒ 1cm = 567twip Twentieth of an Inch Point Acリストボックス、マルチ選択 DoCmd.OpenForm "F1", acDesign デザインで指定 ⇒ Save Fm.Controls("Lst1").MultiSelect = 1 1 = クリックマルチ選択、 2 = シフトマルチ選択 - 48 - VBA系 2016/7/30 配列渡し v = Ar Call Test2_2(Ar) Call Test2_2(v) Function Test2_2(ByRef Ar() As String) Function Test2_2(ByVal Ar As Variant ) Dim i As Long 【以下全く同様】 Dim v As Variant For i = LBound(Ar) To UBound(Ar) MsgBox Ar(i) Refの場合のみ参照渡し Ar(i) = Ar(i) & "京都" Next i For Each v In Ar MsgBox v いづれでも値渡し扱い v = v & "滋賀" Next v 【2次配列可能】 End Function 【バリアントFor順 = 1次 ⇒ 2次】 シェル系 '※ 外部参照 Windows Script Host Object Module Dim WSHnet As New IWshRuntimeLibrary.WshNetwork Dim WSH As New IWshRuntimeLibrary.WshShell Set WSHnet = CreateObject("Wscript.Network") Set WSH = CreateObject("Wscript.Shell") MsgBox WSHnet.ComputerName MsgBox WSHnet.UserName MsgBox WSHnet.UserDomain MsgBox WSH.SpecialFolders("DeskTop") WSH.Popup "Text", 3, "Title", vbInformation + vbYesNo WSH.Run "D:\DB\csv1.csv" '※外部参照 Microsoft Shell Controls And Automation Dim Shel As New Shell32.Shell Set Shel = CreateObject("Shell.Application") Shel.UndoMinimizeALL Shel.MinimizeAll '全ウィンドウ最小化から復元 '全ウィンドウ最小化 Shel.ShutdownWindows 'シャットダウンっぽい Shel.TileHorizontally '全ウィンドウ横表示っぽい Shel.TileVertically '全ウィンドウ並べ表示っぽい 'For Each c In Shel.Windows - 49 - VBA系 2016/7/30 Mail Dim oApp As New Outlook.Application 'Dim myNameSpace As Outlook.Namespace Dim SubFol As Outlook.Folder Dim mITEM As Outlook.MailItem MAPI = Dim i As Long Messaging Application Program Interface '受信ボックス内サブフォルダ With oApp.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox) For Each SubFol In .Folders MsgBox SubFol.Name If SubFol.Items.Count > 0 Then For i = 1 To SubFol.Items.Count Set mITEM = SubFol.Items(i) Stop MsgBox mITEM.Body 本文 MsgBox mITEM.cc MsgBox mITEM.BCC ' mITEM.Attachments.Item(1).SaveAsFile "FullPath" MsgBox mITEM.SenderName MsgBox mITEM.SenderEmailAddress MsgBox mITEM.Size MsgBox mITEM.Subject MsgBox mITEM.To MsgBox mITEM.BodyFormat Next i End If Next SubFol End With Set oApp = Nothing Set SubFol = Nothing Set mITEM = Nothing MsgBox "Finish!", 64 - 50 - VBA系 2016/7/30 VBE操作 '''コード行追加 'CodeModule.InsertLines(line, code) 'With ThisWorkbook.VBProject.VBComponents("Module1").CodeModule ' .InsertLines 7, vbTab & "Debug.Print Now()" 'End With '''コード行削除 'CodeModule.DeleteLines (startline [, count]) ' └count既存値 = 1 = 指定スタートラインから1行 ' With ThisWorkbook.VBProject.VBComponents("Module" & i).CodeModule ' .DeleteLines 1, .CountOfLines ' .AddFromString Join(vntAry, vbNewLine) ' '既存コード削除 '追加 End With '''コード置換 'CodeModule.ReplaceLine(line, code) '''モジュール行数取得 'MsgBox ThisWorkbook.VBProject.VBComponents("Module1").CodeModule.CountOfLines '''VBEカウント 'MsgBox Application.VBE.VBProjects.Count '''VBEファイル名 'MsgBox Application.VBE.VBProjects(2).Filename '''モジュール名 'MsgBox Application.VBE.VBProjects(2).VBComponents("Module2").Name '''VBEプロジェクト, VBコンポネント(各モジュール), 各モジュールのコード本体 'With Application.VBE.VBProjects(2).VBComponents ' For i = 1 To .Count ' MsgBox .Item(i).Name ' With .Item(i).CodeModule ' ' ' v = .Lines(1, .CountOfLines) 'ThisWorkBook, Module1など 'コード本体 End With Next i 'End With - 51 - VBA系 2016/7/30 '''コードモジュールまとめ 'With Application.VBE.VBProjects(2).VBComponents("Module2").CodeModule ' v = .Lines(1, .CountOfLines) ' ''テキストからモジュール追加 ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 'コード本体(モジュール全体) .AddFromFile Filename:="C:\Code.txt" ''文字列からモジュール追加, 追加位置は宣言部分の次行 .AddFromString String:="'新モジュール2" ''API + パブリック宣言行数 MsgBox .CountOfDeclarationLines ''コード行数 MsgBox .CountOfLines ''行あたりコード追加 .InsertLines 7, "'コメント10行目" ''指定行のコード本体 MsgBox .Lines(StartLine:=10, Count:=2) ''モジュールあたりコード本体行数 MsgBox .ProcBodyLine(ProcName:="東山1", ProcKind:=vbext_pk_Proc) ''モジュールあたりコード行数 MsgBox .ProcCountLines(ProcName:="東山1", ProcKind:=vbext_pk_Proc) ''指定モジュール開始行数 MsgBox .ProcStartLine("東山1", vbext_pk_Proc) '指定行数コード置換 .ReplaceLine Line:=6, String:="'6行目交換" 'End With '''タイプ 'MsgBox Application.VBE.VBProjects(2).VBComponents("Module2").Type '└ 1=標準モジュール, 2=クラス, 3=フォーム, 11=ActiveX, 100=ドキュメントモジュール '''新モジュール追加 'With Application.VBE.VBProjects(2) ' .VBComponents.Add 3 '1=標準, 2=クラス, 3=フォーム ' .VBComponents(.VBComponents.Count).Name = "新モジュール" ' With .VBComponents(.VBComponents.Count) 'End With '''フォーム作成, リネーム, コントロール追加 '.VBComponents.Add 3 '1=標準, 2=クラス, 3=フォーム '.VBComponents(.VBComponents.Count).Name = "新モジュール" - 52 - 'With .VBComponents(.VBComponents.Count) VBA系 2016/7/30 ' 'コントロール追加 ' With .Designer.Controls.Add("Forms.CommandButton.1", "CommandButton1", True) ' .Left = 10 ' .Top = 20 ' .Width = 100 ' .Height = 100 モジュール削除 ' .ControlTipText = "京都" ppMain.VBProject.VBComponents.Remove c ' End With ' ' 'フォームコード追加 ' .CodeModule.AddFromString "'コメント" 'End With Function Test_Conf1() Dim i As Long Dim v As Variant With Application.VBE.VBProjects(2) 'フォーム作成, リネーム .VBComponents.Add 3 '1=標準, 2=クラス, 3=フォーム .VBComponents(.VBComponents.Count).Name = "新モジュール" With .VBComponents(.VBComponents.Count) 'コントロール追加 With .Designer.Controls.Add("Forms.CommandButton.1", "CommandButton1", True) .Left = 10 .Top = 20 .Width = 100 .Height = 100 .ControlTipText = "京都" End With 'フォームコード追加 .CodeModule.AddFromString "'コメント" End With End With MsgBox "Fnish!", 64 End Function - 53 - VBA系 2016/7/30 コントロール、プログレス MSComctlLib.ProgCtrl.2 Set Ctl = UserForm1.Controls.Add("MSComctlLib.ProgCtrl.2", "Btn1", True) 水平線 イコール, チルダ, マイナス(ハイフン), アンダーバー ピボット, カラムF, pvfアイテム, 最大最小 Set pv = ActiveSheet.PivotTables(1) For Each pvf In pv.ColumnFields For Each pvi In pvf.PivotItems Debug.Print "pvf = " & pvf.Name Debug.Print vbTab & "└ pvi = " & pvi.Name Debug.Print WorksheetFunction.Max(pvi.DataRange) Next pvi 特定フィールドデータ範囲 = pvi.DataRange Next pvf エクセルオープン時 Private Sub Auto_Open() 正規表現 Set RE = CreateObject("VBScript.RegExp") Microsoft VBScript Regular Expressions 5.5 プロパティ Pattern 正規表現文字列 IgnoreCase Trueで大文字小文字を非区分, 初期値=False Global Trueで全てのマッチ部分の検索・置換, 初期値=False Multiline Trueで各行の先頭や末尾で"^", "$"がマッチ, 初期値=False Test 引数として文字列、正規表現マッチでTrue, 不一致でFalse Replase 引数として検索文字列と置換後文字列 Excute 条件を指定した後のテキスト返し(Global時はカンマ区切り) メソッド - 54 - VBA系 2016/7/30 正規表現パターン シンボル 機能 ^ 文字列の先頭にマッチします。 $ 文字列の末尾にマッチします。 \b 単語の境界にマッチします。 \B 単語の境界以外にマッチします。 \n 改行にマッチします。 \f フォームフィード(改ページ)にマッチします。 \r キャリッジリターン(行頭復帰)にマッチします。 \t 水平タブにマッチします。 \v 垂直タブにマッチします。 8進数(シフトJIS) xxx によって表現される文字にマッチします。"\101" は "A" に マッチします。ただし、ASCII文字以外の文字(半角カタカナ、全角文字等)には使え ません。 16進数(シフトJIS) dd によって表現される文字にマッチします。"\x41" は "A" に マッチします。ただし、ASCII文字以外の文字(半角カタカナ、全角文字等)には使え ません。 Unicode(UTF-16) xxxx によって表現される文字にマッチします。全角文字にも使え ます。必ず xxxx の部分は4桁にしてください。"\u0041" は "A" にマッチします。 "\u3042" は "あ" にマッチします。 \xxx \xdd \uxxxx [] "[ ]" 内に含まれている文字にマッチします。"-"による範囲指定も使えます。全角 文字にも対応しています。 [^ ] "[^ ]" 内に含まれている文字以外にマッチします。"-"による範囲指定も使えます。 全角文字にも対応しています。 \w 単語に使用される文字にマッチします。[a-zA-Z_0-9]と同じ意味です。 \W 単語に使用される文字以外の文字にマッチします。[^a-zA-Z_0-9]と同じ意味です。 . \n 以外の文字にマッチします。全角文字にもマッチします。 \d 数字にマッチします。[0-9]と同じ意味です。 \D 数字以外の文字にマッチします。[^0-9]と同じ意味です。 \s スペース文字にマッチします。[ \t\r\n\v\f]と同じ意味です。 \S スペース文字以外の文字にマッチします。[^ \t\r\n\v\f]と同じ意味です。 {x} 直前の文字のx回にマッチします。 {x,} 直前の文字のx回以上にマッチします。 {x,y} 直前の文字のx回以上、y回以下にマッチします。 ? 直前の文字の0または1回にマッチします。{0,1}と同じ意味です。 * 直前の文字の0回以上にマッチします。{0,}と同じ意味です。 + 直前の文字の1回以上にマッチします。{1,}と同じ意味です。 () 複数の文字をグループ化します。ネストすることができます。 | 複数の文字列を1つの正規表現にまとめ、そのうちのいずれかにマッチします。 メタ文字とエスケープ時メタ文字一覧 ^ $ ? * + . | { } \ [ ] ( ) \^ \$ \? \* \+ \. \| \{ \} \\ \[ \] \( \) - 55 - VBA系 2016/7/30 正規表現例, Execute Const strConst As String = "京都az吉祥院nne." '参照設定: Microsoft VBScript Regular Expressions 5.5 Dim Re As New VBScript_RegExp_55.RegExp ⇒ CreateObject("VBScript.RegExp") Dim objMatches As IMatchCollection2 Dim i As Long プロパティ3つは既存False Re.Pattern = "[a-zA-Z]+" パターン Re.Global = True Ture=全体に対し, False=で最初の1件 Re.MultiLine = True Ture=改行ごとに対し, False=改行無視 Re.IgnoreCase = True True=大文字小文字度外視 Set objMatches = Re.Execute(strConst) objMatchesに結果, 配列ではない For i = 0 To objMatches.Count - 1 MsgBox objMatches.Item(i).Value 戻り値=az, nneの2つ Next i 正規表現例, Replace Dim Re As New VBScript_RegExp_55.RegExp Dim objMatches As Object Dim strRet As String Re.Pattern = "[^0-9]+" Re.Global = True Re.MultiLine = True Re.IgnoreCase = True strRet = Re.Replace("京都2010年8月", vbNullString) 戻り値= "20108" MsgBox strRet 正規表現, Test Re.Pattern = "[6-8]" MsgBox Re.Test("京都市2015年8月") 戻り値=理論値 OLEDB.Connections strTmp = "Select * From emp Where deptno = 10" 接続の説明書き = MsgBox ThisWorkbook.Connections(1).Description ThisWorkbook.Connections(i).OLEDBConnection.CommandType = xlCmdSql 接続タイプ .CommandType = xlCmdSql コマンドテキスト .CommandText = strTmp 再接続 .Reconnect ソースファイル .SourceDataFile 接続されているか .IsConnected - 56 - VBA系 2016/7/30 Ex OLEObject ' objOLE.Verb xlVerbPrimary objOLE.Verb '音声OLEなどの開始 '編集モードに '編集モードエクセルセット Set xlBK = objOLE.Parent.Parent 'エクセルブック '編集として開かれたブックを取得 Set xlBK = xlBK.Parent.Workbooks(xlBK.Parent.Workbooks.Count) '処理サンプル xlBK.Sheets("Sheet2").Range("A1").Value = Now() xlBK.Close False IEドロップダウン (Select) └ ①Valueから値入力 or ②Selected = Trueから ①Valueから変更 IE.Document.getElementsByName("y")(0).Value = 2014 ②Selectedから IE.Document.getElementsByTagName("Option")(2).Selected = True └ Optionタグが上から何番目にあるか判断してSelected ⇒ (SelectedIndexを使用), コンマ文字などは下記のようにALL後へパーレン IE.Document.all("JobListList:dgdSearchResultList:_ctl1:_ctl5").selectedIndex = 3 IE, Select内Optionテキスト取得 lngIndex = IE.Document.getElementById("m").options.selectedIndex MsgBox IE.Document.getElementById("m").options(lngIndex).Text mから for each 可 IEファイアーイベント c.FireEvent("OnChange") IEファイアーイベントをJava script起動で代替 IE.Document.parentWindow.execScript strFuncVar strFuncVar' は java script 中のファンクション名と変数 function ChangePic(myPicURL, lngHeight, strComment){ IEラジオボタン ①Checked = True, or ②クリックから ① IE.Document.getElementById("tsFir").Checked = True ② IE.Document.getElementById("tsArr").Click 散布図 近似曲線数式 Debug.Print Se.Trendlines(1).DataLabel.Text (ex) y = 12.167x - 24355 Excel 改行置換, 手動操作時 Ctrl + H ⇒ Ctrl + J Ctrl + Jで空白が入力されているように見れるが改行コード - 57 - VBA系 2016/7/30 IE, タグネームのn番目 IE.Document.getElementsByTagName("Option")(n).Selected = True IDは単数 GetElementByID("") ⇒ IDはユニーク Nameは複数かつn番目指定 GetElementsByName("Li")(1).InnerText TagNameも同様にn番目指定 Word使用, 単語区切り Dim wdApp As New Word.Application Dim wdDoc As Word.Document Dim wdWord As Object Dim vntSpt As Variant Set wdDoc = wdApp.Documents.Add wdApp.Visible = True wdDoc.Range.Text = _ "本日の京都市南区吉祥院" & vbNewLine & "の天気予報は雪です。" '単語単位で区切り For Each wdWord In wdDoc.Words MsgBox wdWord Next '改行区切りで格納(vbNewline, vbLF不可 ⇒ vbCR or Chr(13)で vntSpt = Split(wdDoc.Range.Text, vbCr) MsgBox vntSpt(0) wdApp.Quit False Set wdApp = Nothing Set wdDoc = Nothing IE各種バー表示 IE.StatusBar = True ツールバーが一番親, ツールバー非表示では IE.MenuBar = True メニューバーやアドレスバーも非表示 IE.AddressBar = True IE.Toolbar = True IE.Toolbar = False IE.navigate "http://transit.loco.yahoo.co.jp/" IE.navigate2 "http://weather.yahoo.co.jp/weather/", 2048 別タグへ IE.Toolbar = True - 58 - VBA系 2016/7/30 SendKey SendKeys "%(yy)" %y ⇒ %y Sendkeys "%yy" %y ⇒ y 既存エクスプローラー or IE位置サイズ調整 Dim objSL As New Shell32.Shell Dim c As Object フォルダ ⇒ IShellFolderViewDual3 For Each c In objSL.Windows file:///D:/Work MsgBox TypeName(c.Document) & vbNewLine & c.LocationURL IE時 ⇒ HTMLDocument c.Left = 100 Next c http://yahoo.co.jp コレクション Dim Col As New Collection 'コレクションは1スタート not zero Col.Add "京都府", "都道府県" Col.Add "京都市", "市" Col.Add "南区", "区" Col.Add "吉祥院", "町1" Col.Add "這登西町", "町2" MsgBox Col("区") & vbNewLine & Col(4) Col.Remove 1 MsgBox Col("区") & vbNewLine & Col(4) MsgBox Col.Count Rsのようにフィールド名でもインデックスでも値取得可能(上書き) インデックスは1スタート not zero コレクション Dim cl_Sh As New Collection cl_Sh.Add ActiveSheet, "ShMain" 配列可能 要素のデータ型問わず cl_Sh("ShMain").Tab.Color = vbGreen For Each v In cl_Sh MsgBox v.Name Next v IEタグ操作 IE.Document.ALL.y(0).InnerText Name=y, n-1番目(インデックスゼロスタート) - 59 - VBA系 2016/7/30 IEポップアップ IE9から GetLastActivePopupは使用不可のためFindWindowを使用 FindWindow("#32770", "Web ページからのメッセージ") データ型、変数型 TypeNameで取得可能 TypeName(CreateObject("Shell.Application").Windows) ⇒ IShellWindows IE_ALL各種取得方法 MsgBox objIE.document.all(0).outerHTML MsgBox objIE.document.all.Item(0).outerHTML MsgBox objIE.document.all.tags("html")(0).outerHTML MsgBox objIE.document.getElementsByTagName("html")(0).outerHTML Like演算子, 以外判定 イクスクラメーション【!】使用, ブラケットで囲む この場合、ブラケット内文字列は1つの文字列 (like word) として扱われる Like "[京都]*", Like "[!京都]*" IE, 子に対して検索 For Each cc In c.Children MsgBox cc.innerText Next cc 子の特定タグに対し ⇒ For Each cc In c.getElementsByTagName("Option") ダイレクトに ⇒ MsgBox c.getElementsByTagName("Option")(0).innerText IE一般用語 パワポノート ppSp.Parent.NotesPage.Shapes.Placeholders(2).TextFrame.TextRange = "京都" エクセルブック範囲(名前範囲) Set rngFrom = xlBK.Parent.Range("pvRng") Set rngFrom = Application.Range("Book1.xlsm!pvRng") - 60 - VBA系 2016/7/30 IE, ウィンドウスクロール IE.Document.parentWindow.execScript "window.scrollTo(100, 100);" 絶対座標 IE.Document.parentWindow.execScript "window.scrollBy(100, 100);" 相対座標 第二引数が縦位置 【特定IDへ】 location.hash ="TestID2"; (左記をそのまま execScript の引数へ) window.scrollBy(0, -10); 絶対パス取得 MsgBox FSO.GetAbsolutePathName("..\") VBAからも可能 var FSO = new ActiveXObject("Scripting.FileSystemObject"); java script strPath = FSO.GetAbsolutePathName( './' ); alert( strPath ); Ac以外のユーザーフォーム、コントロール削除 Set Designer = xlBK.VBProject.VBComponents("UserForm1").Designer Set Ctrl = Designer.Controls.Add("Forms.CommandButton.1", "Btn1", True) Designer.Controls.Remove "Btn1" hoge, piyo, fuga, foo, bar, baz Alice and Bob 23, 42 AliceがBobに情報を送る Shell.Appli デスクトップ表示 Shel.ToggleDesktop フォルダオープン Shel.Open "d:\db" Shell32.Shell fso getExtensionName ⇒ 実在しないファイルでも可 ("D:aaaaa.cccsv" ⇒ "cccsv") グループ化のバイトケース acグループ化 全角半角大文字小文字すべて同じとみなす xlピボット 大文字小文字は同じとみなす。全角半角は別。 ADO_SQL acグループ化と同じで全て同じとみなす。 scripting.Dictionary 全角半角大文字小文字すべて区別する。 acインポートエクスポート定義 ("保存済みのインポート操作" の方) Dim c As ImportExportSpecification Set c = CurrentProject.ImportExportSpecifications("imDef1") Debug.Print cc.XML - 61 - VBA系 2016/7/30 html テーブル内の隣行列 var ele= document.getElementById("cc") alert(ele.parentElement.innerText); alert(cc.innerText); alert(cc.parentElement.children[1].innerText + '\n └ 右列'); alert(cc.parentElement.parentElement.children[1].children[0].innerText + '\n └ 下行'); xlセルエラー Rng.Errors(xlNumberAsText).Ignore = True パスワード付acへ接続 Set db = DBEngine.Workspaces(0).OpenDatabase(strmdb, False, False, ";pwd=パスワード") ワードへペースト Set WordDoc = ObjWord.Application.Documents.Add WordDoc.Paragraphs(1).Range.Paste 花束文字 🎉 ChrW(-10180) & ChrW(-8311) xlコンボ 候補文字列を表示しない ⇒ MatchEntry = 2-fmMatchEntryNone adoからのパラメーターacクエリの実行 cmd.ActiveConnection = cn cmd.CommandText = "q1" '単純なクエリ名 cmd.CommandType = adCmdTable cmd.Parameters.Refresh cmd.Parameters(0) = "oosaka" 'インデックス番号のみ Set rs = cmd.Execute - 62 - CommandBar VBA系 2016/7/30 Static n As Long Dim objCB As CommandBar Dim objCtl As CommandBarButton Dim strName As String n=n+1 strName = "京都" & n Set objCB = Application.CommandBars.Add(Name:=strName _ , Position:=msoBarTop, MenuBar:=False, Temporary:=True) Set objCtl = objCB.Controls.Add(Type:=msoControlButton) Application.CommandBars(strName).Visible = True With objCtl .Caption = "SampleCaption" & n .Style = msoButtonCaption .Style = msoButtonIconAndCaption .FaceId = 483 .BeginGroup = True .OnAction = "SampleOnAction" End With With Application.CommandBars(strName) .Visible = True .Position = msoBarTop End With IE画像非表示、処理速度向上 インターネットオプション ⇒ 詳細設定 ⇒ (下の方) ☑ 画像を表示する Acから他のAc操作 Dim wsp As Workspace Dim db As Database Dim rs As DAO.Recordset Set wsp = DBEngine.CreateWorkspace("", "Admin", "") Set db = wsp.OpenDatabase("D:\DB\DB.accdb") wsp.BeginTrans Set rs = db.OpenRecordset("select * from t1") - 63 - VBA系 2016/7/30 ピボット内範囲詳細 ※特定範囲選択 MsgBox pvf.DataRange(1, 1) & vbNewLine & pvf.DataRange(2, 2) & vbNewLine & pvf.DataRange(3, 3) ※特定複数範囲選択 MsgBox WorksheetFunction.Sum(pvf.DataRange(1, 3), pvf.DataRange(2, 4)) ※連続範囲選択 MsgBox WorksheetFunction.Sum(Range(pvf.DataRange(1, 3), pvf.DataRange(2, 4))) ※ピボットアイテム範囲 MsgBox WorksheetFunction.Sum(pvf.PivotItems("東京").DataRange) ※ピボット全体ソース範囲 MsgBox Application.ConvertFormula(pv.SourceData, xlR1C1, xlA1) データ範囲行列数取得 pvf.DataRange.Rows.Count (col同様) ピボットアイテム範囲セル pvf.DataRange.Address (最左1列のみ) レコードセット保存から rs.Open CurrentProject.Path & "\rs", , adOpenKeyset, adLockOptimistic MsgBox rs(1) rs.Update "Num", 22 rs.Save rs.Close Cn接続しない複数DBをJon結合サンプル Select L.Str, R.Str2, L.Int From (Select Str, StrInt, Int From [Sheet1$] As L In 'D:\DB\Book1.xlsm' 'Excel 8.0;Hdr=Yes') As L Left Join (Select Str, Str2 From [Sheet2$] As R In 'D:\DB\Book3.xlsm' 'Excel 8.0;Hdr=Yes') As R On L.Str = R.Str ○Ac内部と外部DBでのJoin⇒クエリ, ADO共に可確認 ○Ex内部と外部DBでのJoin⇒ADO可確認済 ○AcからExへADOCn接続中は、該当エクセル自体をRs取得不可 - 64 - VBA系 2016/7/30 xl から DAO 接続からの SQL, Format関数可 Format 関数利用可 rs.MoveLast に一度行けば rs.RecordCount 可 rs.AbsolutePosition 可 strSQL = "Select Str, Format(Int, '#,##0') As _Int_ From [Sheet1$];" With CreateObject("DAO.DBEngine.120").Workspaces(0) Set DB = .OpenDatabase(strPath, False, True, "Excel 8.0;Hdr=Yes") Set rs = DB.OpenRecordset(strSQL, dbOpenSnapshot) End With OpenDatabase( name, options, readonly, connect) = (, 排斥, , excel 8.0;hdr) ex リストボックス List に2次配列可能 .Column(Col, Row) で値セット可能 特定IE最前面 SetForegroundWindow ie.hWnd エクセル, ウィンドウ, アプリ系 xlApp.CommandBars.ExecuteMso "MinimizeRibbon" リボン xlApp.DisplayFormulaBar = False 数式バー xlApp.DisplayFullScreen = False フルスクリーン xlApp.DisplayScrollBars = False 'シート部分含む スクロールバー xlApp.DisplayStatusBar = False ステータスバー xlApp.Windows(1).DisplayGridlines = False グリッドライン xlApp.Windows(1).DisplayHeadings = False ヘッドライン xlApp.Windows(1).DisplayVerticalScrollBar = False 縦スクロールバー xlApp.Windows(1).DisplayHorizontalScrollBar = False 横スクロールバー xlApp.Windows(1).DisplayZeros = False ゼロ表示 xlap.Windows(1).DisplayWorkbookTabs=False シートバー xlApp.CommandBars.ExecuteMso "MinimizeRibbon" "MinimizeRibbon" 中は大文字と小文字区分 実行されるたびに 最大化と最小化入替え リボンが最少化されているかの確認 Application.CommandBars.GetPressedMso("MinimizeRibbon") 上記Trueが最小化、Falseは逆 - 65 - VBA系 2016/7/30 https://msdn.microsoft.com/ja-jp/library/office/ff823068.aspx?f=255&MSPPError=-2147217396 Webページとして保存 With ActiveWorkbook.PublishObjects.Add( _ SourceType:=xlSourceRange _ ソースタイプ, (下記参考) , Filename:=strFile _ ファイルフルネーム(D:\file.mht) , Sheet:="Sheet1" _ SourceTypeがシート時に指定 , Source:="$A$1:$F$37" _ SourceTypeがピボットやセル範囲時に指定 , HtmlType:=xlHtmlStatic _ (xlHtmlStatic)以外廃止なので通常省略に) , DivID:="" _ (通常省略) , Title:="京都") SouceTyepセル範囲指定でトップ表示 .Publish (True) .AutoRepublish = False SouceType:=Book ⇒ End With SourceType xlSourceAutoFilter 3 オートフィルターの範囲 xlSourceChart 5 グラフ xlSourcePivotTable 6 ピボットテーブル レポート xlSourcePrintArea 2 印刷用に選択したセル範囲 xlSourceQuery 7 クエリ テーブル (外部データ範囲) xlSourceRange 4 セル範囲 xlSourceSheet 1 ワークシート全体 xlSourceWorkbook 0 ブック ※ピボットやセル範囲時はピボット名や範囲名を 'Source'へ指定 SQL日付(ado) select L.prefecCode, R.prefecCode, R.Prefecture, L.sDate, L.Num, L.Str from (select * from [data$] in 'D:\data.xlsm' 'excel 8.0;hdr=yes;') as L left join (select * from [prefecture.csv] in 'D:\' 'text;hdr=yes;') as R on L.prefecCode = R.prefecCode where sDate in (#2015/01/01#, #2015/1/2#) シングル不可 order by L.prefecCode asc; ado, レコード操作 rs.Find _ ファインドはメソッド Criteria:="Prefecture = '京都府'" _ , SkipRecords:=0 _ , SearchDirection:=adSearchForward _ , Start:=0 - 66 - VBA系 2016/7/30 ウィンドウハドル ac MsgBox hWndAccessApp pp(2010, 2013) MsgBox FindWindow("PPTFrameClass", ppMain.Application.Caption) ex MsgBox FindWindow("XlMain", vbNullString) エクセル散布図, ポイント Set ct = ActiveSheet.ChartObjects(1).Chart Set se = ct.SeriesCollection For Each s In ct.SeriesCollection For Each p In s.Points Debug.Print p.Name = "S1P2" シリーズ1のポイント2 エクセルグラフ, ソース範囲最大値など MsgBox WorksheetFunction.Max(se.Item(2).Values) ADO SQL から StrConv可能 1 大文字 8 全角⇒半角 2 小文字 16 ひらがな⇒カナ 3 先頭を大文字 32 カナ⇒ひらがな 4 半角⇒全角 IE ToolBar=AddressBar ↓はステータスバー - 67 - VBA系 2016/7/30 Ac列幅 CurrentDb.QueryDefs("Q_Test").Fields("Str").Properties("ColumnWidth").Value=5000 └ クエリに適用すれば、該当クエリをRowSourceとするサブフォームにも有効 リボン非表示 (not 最小化) DoCmd.ShowToolbar "Ribbon", acToolbarNo DoCmd.ShowToolbar "Ribbon", acToolbarYes xlApp.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",False)" xlApp.ExecuteExcel4Macro "Show.ToolBar(""Ribbon"",True)" 最小化確認 = xlApp.CommandBars.GetPressedMso("MinimizeRibbon") スプリット分解中文字列配列群 Const str As String = "aa bb cc dd" For Each c In Split(str) Split 指定無しでスペース区切り MsgBox c Next MsgBox Split(str)(0) undo 単発で使用も可能 App.CommandBars.ExecuteMsoは ac, xl 共に有り Application.CommandBars.ExecuteMso "Undo" Application.CommandBars.ExecuteMso "Redo" acフォーム下部, レコードセレクタ及び移動ボタン Having HAVING句では、SELECT句で指定していないフィールドを条件に使用することもできます Havingは集計後結果の条件 単純右クリックショートカット Shift + F10 VBEコマンドバー VBEツールバーを右クリック ⇒ ユーザー設定 ⇒ ツールバー ⇒ ショートカットメニュー ユーザー設定ダイアログ中のコマンドタブからショートカットメニューをドラッグ - 68 - acフォームフォーマット VBA系 2016/7/30 分割フォーム acボタンの画像表題 - 69 - VBA系 2016/7/30 - 70 - VBA系 2016/7/30 ツリービューコントロール Dim xlSh As Excel.Worksheet Dim TrV As TreeView Dim Nodes1 As Node 'ツリービュー定義(oleObjects.Object) Set xlSh = ActiveSheet Set TrV = xlSh.OLEObjects("TreeView31").Object 'イメージリストと関係 TrV.ImageList = xlSh.OLEObjects("ImageList31").Object '外見 TrV.Appearance = cc3D TrV.Appearance = ccFlat '枠線 TrV.BorderStyle = ccFixedSingle TrV.BorderStyle = ccNone '枠線スタイル TrV.LineStyle = tvwTreeLines TrV.LineStyle = tvwRootLines 'チェックボックスの有無 TrV.CheckBoxes = False TrV.CheckBoxes = True TrV.FullRowSelect = False TrV.FullRowSelect = True '全体スタイル TrV.Style = tvwPictureText TrV.Style = tvwPlusMinusText TrV.Style = tvwPlusPictureText TrV.Style = tvwTextOnly TrV.Style = tvwTreelinesPictureText TrV.Style = tvwTreelinesPlusMinusPictureText TrV.Style = tvwTreelinesPlusMinusText '●Main● TrV.Style = tvwTreelinesText - 71 - TrV.Style = tvwTreelinesPlusMinusPictureText VBA系 2016/7/30 'ノードあたり設定 TrV.Nodes(1).BackColor = RGB(255, 255, 200) TrV.Nodes(1).Bold = True TrV.Nodes(1).Checked = True TrV.Nodes(1).ForeColor = vbGreen TrV.Nodes(1).Image = "a" TrV.Nodes(2).Selected = True TrV.Nodes(1).Text = TrV.Nodes(1).Text & "★" 'ノード登録 TrV.Nodes.Clear TrV.Nodes.Add Key:="key1", Text:="Parent1" TrV.Nodes.Add Key:="key2", Text:="Parent2" TrV.Nodes.Add Key:="key3", Text:="Parent3" '定数tvwChild=4 TrV.Nodes.Add Relative:="key1", Relationship:=tvwChild _ , Key:="key1-1", Text:="Parent1-A" TrV.Nodes.Add Relative:="key1", Relationship:=tvwChild _ , Key:="key1-2", Text:="Parent1-B" TrV.Nodes.Add Relative:="key3", Relationship:=tvwChild _ , Key:="key3-1", Text:="Parent3-A" TrV.Nodes.Add Relative:="key3", Relationship:=tvwChild _ , Key:="key3-2", Text:="Parent3-B", Image:="a" TrV.Nodes.Add Relative:="key3-1", Relationship:=tvwChild _ , Key:="key3-1-1", Text:="Parent3-A-a", Image:="a", SelectedImage:="b" 'ノード削除 TrV.Nodes.Remove "key2" 'ノード選択 TrV.Nodes("key3").Expanded = False TrV.Nodes("key3-1-1").Selected = True TrV.Nodes("key3-1-1").Selected = False - 72 - VBA系 2016/7/30 'ノード変数セットとプラスマイナス拡張 Set Nodes1 = TrV.Nodes("key3") Nodes1.Expanded = False Nodes1.Expanded = True Set TrV = Nothing: Set Nodes1 = Nothing (参考)参照設定 Microsoft ActiveX Data Objects 2.8 Library Microsoft ADO Ext. 2.8 for DDL and Security Microsoft Excel 15.0 Object Library Microsoft HTML Object LIbrary Microsoft Internet Controls Microsoft Outlook 15.0 Object Library Microsoft PowerPoint 15.0 Object Library Microsoft Scripting Runtime Microsoft Shell Controls And Automation Microsoft VBScript Regular Expressions 5.5 Microsoft Word 15.0 Object Library Microsoft Script Host Object Model Microsoft Office 15.0 Object Library Microsoft Visual Basic for Applications Extensitbliry UIAutomationClient ac現在実行中のフォーム参照 Dim obj As Form Set obj = Application.CodeContextObject コード実行元のフォームやレポート acデザインで非表示コントロールの表示 forms(0).chktest1.inselection=true acフォームオープン確認 lngRet = SysCmd(acSysCmdGetObjectState, acForm, "F_SetPpPosition") strRet = IIf(lngRet = 1, "Opened", "Closed") MsgBox strRet strRet = IIf(CurrentProject.AllForms("F_SetPpPosition").IsLoaded _ , "Opened", "Closed") MsgBox strRet CurrentProject.AllForms("f1").IsLoaded CurrentData.AllTables("t1").IsLoaded - 73 - VBA系 2016/7/30 acセクション MsgBox acForm.Section(i).Controls.Count acDetail, acHeader, acFooter, acPageHeader, acPageFooter acフォームやコントロール作成 Dim acForm As Access.Form acBoundObjectFrame Dim acText As Access.TextBox acCheckBox チェック ボックス acComboBox コンボ ボックス 'フォーム作成 acCommandButton Set acForm = CreateForm() acCustomControl 'レコードソース 連結オブジェクト フレーム コマンド ボタン ActiveX コントロール acImage イメージ acLabel ラベル acLine 直線コントロール acForm.RecordSource = "T1" 'キャプション acListBox リスト ボックス acForm.Caption = "Cap" acObjectFrame 非連結オブジェクト フレーム acOptionButton オプション ボタン 'コントロール(テキストボックス)作成 acOptionGroup オプション グループ Set acText = CreateControl( _ acPage Page オブジェクト acPageBreak 改ページ コントロール FormName:=acForm.Name _ , ControlType:=acTextBox _ , Section:=acDetail _ , Parent:="" _ , ColumnName:="Str" _ , Left:=100, Top:=100, Width:=1500, Height:=500) 'フォームオープン acRectangle 四角形 DoCmd.OpenForm acForm.Name acSubform サブフォーム acTabCtl acTextBox '終了 acToggleButton タブ コントロール テキスト ボックス トグル ボタン Set acText = Nothing: Set acForm = Nothing acエクスポート Docmd.OutputTo ⇒ 書式付き Docmd.TransferSpreadSheet ⇒ 値のみ xlピボット範囲セル MsgBox pv.DataBodyRange.Address pv.DataBodyRange = ピボット中の Data Fields セル範囲 pv.SourceData = ピボットソースデータのセル範囲 MsgBox Application.ConvertFormula(pv.SourceData, xlR1C1, xlA1) - 74 - VBA系 2016/7/30 ac日付ピッカー (テキストボックス) Set fm = Forms("F_TempTest") Set txt = fm.Controls("txt1") MsgBox txt.ShowDatePicker txt.ShowDatePicker = 0 '0=なし, 1=日付 acモジュールプロシージャオープン DoCmd.OpenModule "M_MyFunc_xl", "retChartType" モジュール名, プロシージャー名 transferSpreadSheetは対象xlは開いていてはいけない acウィンドウサイズ DoCmd.Maximize Maximize ⇔ Minimize DoCmd.RunCommand acCmdAppMaximize xl常に最前面 Option Explicit Public Declare Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long _ , ByVal cy As Long, ByVal fuFlags As Long) As Long Function wndPos_Test() Application.Wait DateAdd("s", 2, Now) 'アプリを一度最前面に(SetWindowPosは最前面であることが条件) Application.ScreenUpdating = False Application.WindowState = xlMaximized Application.WindowState = xlNormal Application.ScreenUpdating = True 'SetWindowPosからウィンドウポジションセット '第二引数は -1=常に最前面, -2=ノーマル '第三引数以後4つは Left, Top, Width, Height SetWindowPos Application.hWnd, -1, 200, 200, 800, 600, 0 ' SetWindowPos Application.hWnd, -2, 200, 200, 800, 600, 0 '終了 MsgBox Application.hWnd End Function - 75 - VBA系 2016/7/30 ac上記のacVer 標準モジュールへ Public Declare Function GetSystemMetrics Lib "user32.dll" ( _ ByVal nIndex As Long) As Long Public Declare Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal fuFlags As Long) As Long 'フォームの開くとき Private Sub Form_Open(Cancel As Integer) '最大表示で常に最前面設定 SetWindowPos Me.hWnd, -1, 0, 0, GetSystemMetrics(0), GetSystemMetrics(1), 0 SetWindowPos Me.hWnd, -1, 100, 100, 800, 600, 0 End Sub 'クリック時 Private Sub コマンド0_Click() DoCmd.SetWarnings False DoCmd.Close acForm, Me.Name DoCmd.SetWarnings True End Sub Private Sub コマンド1_Click() '常に最前面設定解除 SetWindowPos Me.hWnd, -2, 100, 100, 800, 600, 0 End Sub ieを別タブで開く ie.navigate "http://weather.yahoo.co.jp/weather/" ie.navigate2 "yahoo.co.jp", 2048 Navigate2 の第二引数に "2048" - 76 - VBA系 2016/7/30 acフォーム自体設定 Sub BorderStyleSample() Dim myForm As Form '最小化したフォームを作成 Set myForm = CreateForm() With myForm 'レコードセレクタ .RecordSelectors = True '移動ボタン .NavigationButtons = True '区切り線 .DividingLines = True '境界線スタイル:0=なし, 1=細線, 2=サイズ調整可, 3=ダイアログ '1=ctrlメニューなし, 最大最少なし, 閉じるなし '1 and 2=上記3つすべて有り '3=上記3つの内最大最少のみ無し 'サイズ変更は 2 のみ可能 .BorderStyle = 1 'コントロールボックス .ControlBox = False '作業ウィンドウ固定 .Modal = True 'ポップアップ .PopUp = True 'スクロールバー: 0=なし, 1=水平のみ, 2=垂直のみ, 3=Both .ScrollBars = 3 '標題設定 .Caption = "Cap" End With 'フォームビューでフォームを開く DoCmd.OpenForm myForm.Name Forms(0).Move 100, 100, 3000, 3000 End Sub VBScript 自ファイルパス WScript.ScriptFullName dim fso set fso = createObject("Scripting.FileSystemObject") msgbox fso.getParentFolderName(WScript.ScriptFullName) - 77 - xl クラスモジュールからのシートイベント VBA系 2016/7/30 クラスモジュールへ Public WithEvents shTarget As Excel.Worksheet xlグラフ範囲の動的変更 ①チャートソース範囲に名前付与(シリーズごとに、全体を一括では×) ②シリーズ関数に上記名前を代入 ⇒ 後はピボットと同じく動的変更 ◆範囲名はブック名を付与する ○ Book1.xlsm!aaa × aaa xl他のブックの範囲名取得 (ブック名) ! (範囲名) MsgBox Range(Book1.xlsm!aaa).Address vba で複数のレコードセットを含む場合のrs移動 Set rs = rs.NextRecordset() adoからのパラメーターacクエリの実行 cmd.ActiveConnection = cn cmd.CommandText = "q1" '単純なクエリ名 cmd.CommandType = adCmdTable cmd.Parameters.Refresh cmd.Parameters(0) = "oosaka" 'インデックス番号のみ Set rs = cmd.Execute - 78 - VBA系 2016/7/30 - 79 - VBA系 2016/7/30 - 80 - VBA系 2016/7/30 - 81 - VBA系 2016/7/30 - 82 - VBA系 2016/7/30 - 83 - VBA系 2016/7/30 - 84 - VBA系 2016/7/30 - 85 - VBA系 2016/7/30 - 86 - VBA系 2016/7/30 - 87 - VBA系 2016/7/30 - 88 - VBA系 2016/7/30 - 89 - VBA系 2016/7/30 - 90 - VBA系 2016/7/30 - 91 - VBA系 2016/7/30 - 92 - VBA系 2016/7/30 - 93 - VBA系 2016/7/30 - 94 - VBA系 2016/7/30 - 95 - VBA系 2016/7/30 - 96 - VBA系 2016/7/30 - 97 - VBA系 2016/7/30 - 98 - VBA系 2016/7/30 - 99 - VBA系 2016/7/30 - 100 -