項目
内容説明
'引数にセル又はセル範囲を指定した場合のサンプル Function aSUM(aa As Range) '合計 Dim dd '選択範囲の合計 For Each dd In aa aSUM = aSUM + dd Next End Function Function kSUM(ParamArray par()) '複数選択に対応した合計計算 '引数にセル範囲と数値を考慮したSUM関数と同等の関数 Dim pp, dd 'Debug.Print UBound(par) + 1 'パラメータ数 For Each pp In par If IsNumeric(pp) = True Then '数値 kSUM = kSUM + pp End If If IsArray(pp) = True Then '配列 For Each dd In pp kSUM = kSUM + dd Next End If Next End Function Function aAVERAGE(aa) '平均 '1次元配列による計算例 Dim ii&, jj& For ii = 1 To aa.Count aAVERAGE = aAVERAGE + aa(ii) Next aAVERAGE = aAVERAGE / aa.Count '2次元配列による計算例 'aAVERAGE = 0 'For ii = 1 To aa.Rows.Count '行数 ' For jj = 1 To aa.Columns.Count '列数 ' aAVERAGE = aAVERAGE + aa(ii, jj) ' Next 'Next 'aAVERAGE = aAVERAGE / aa.Count End Function Function SEC(aa) 'セカント SEC = 1 / Cos(aa) End Function Function ARCSIN(aa) 'アークサイン ARCSIN = Atn(aa / Sqr(-aa * aa + 1)) End Functionよく使うプロパティ一覧(aaは選択範囲Rangeの引数名)
aa.Count '選択範囲の個数 aa.Row '先頭行の番号 aa.Rows.Count '行数 aa.Column '先頭列の番号 aa.Columns.Count '列数特記) aa(0,-1)等として選択範囲外の値も取得出来ます
項目
内容説明
'Passwordのかかったブックを開き読み書きして閉じる Sub test_E97M049() Dim wb As Workbook, ws As Worksheet Application.ScreenUpdating = False '画面非更新(Openしたブックを表示しない) Workbooks.Open Filename:="c:\dat\dat1.xls", Password:="abc123" Set wb = Workbooks("dat1.xls") Set ws = wb.Worksheets("Sheet1") ' '読み書きの処理を行う ws.Range("B2") = Date ' wb.Save: wb.Close 'セ−ブし閉じる Application.ScreenUpdating = True End Sub
項目
内容説明
[ファイル]-[開く]ダイアログボックスを表示
Application.Dialogs(xlDialogOpen).Show
[ファイル]-[印刷]ダイアログボックスを表示
Application.Dialogs(xlDialogPrint).Show
次の書式のマクロで、メニュ−コマンドで開く様々なダイアログボックスを表示する事が出来ます。
Application.Dialogs(index).Show
よく用いられる indexを以下に示します。
index | 対応するメニューコマンド |
xlDialogActivate | ウインドウの選択 [ウインドウ]メニュー |
xlDialogActiveCellFont | セルの書式設定 [書式]-[セル] |
xlDialogAddinManager | アドイン [ツール]-[アドイン] |
xlDialogAlignment | セルの書式設定 配置タグ [書式]-[セル]配置タグ |
xlDialogApplyStyle | スタイル [書式]-[スタイル] |
xlDialogArrangeAll | ウインドウの整列 [ウインドウ]-[整列] |
xlDialogClear | 消去 [編集]-[クリア] |
xlDialogColorPalette | オプション 色タグ [ツール]-[オプション]色タグ |
xlDialogFileDelete | ファイルの削除 |
xlDialogFont | フォントの設定 |
xlDialogOpen | ファイルを開く [ファイル]-[開く] |
xlDialogPageSetup | ヘジ設定 [ファイル]-[ページ設定] |
xlDialogPrint | 印刷 [ファイル]-[印刷] |
xlDialogPrinterSetup | プリンターの設定 |
xlDialogPrintPreview | プレビュー [ファイル]-[印刷プレビュー] |
xlDialogProperties | xxx.xlsのプロパティ [ファイル]-[プロパティ] |
xlDialogSaveAs | ファイル名を付けて保存 [ファイル]-[名前を付けて保存] |
xlDialogSetPrintTitles | 印刷タイトルの設定 [ファイル]-[ページ設定]シート |
xlDialogStandardFont | フォントの設定 [書式]-[セル]フォントタグ |
xlDialogStandardWidth | 標準の幅 [書式]-[列]-[幅] |
xlDialogWorkbookName | シート名の変更 [書式]-[シート]-[名前の変更] |
項目
内容説明
'複数のファイルを選択する[ファイルを開く]ダイアログボックスを表示 '指定した複数ファイル名を取得します。ファイルは実際には開かれません。 Sub test1_E97M047() 'GetOpenFilename MultiSelectの例 Dim file As Variant, filter$, title$, ss$, ii& filter = "テキスト ファイル (*.txt),*.txt,Excel ファイル (*.xl*),*.xl*,すべてのファイル (*.*),*.*" title = "" '省略すると"ファイルを開く" file = Application.GetOpenFilename(filter, , title, , True) If VarType(file) = vbBoolean Then Exit Sub '[キャンセル]された '選択ファイルをMsgBoxで表示 For ii = 1 To UBound(file) ss = ss & ii & ") " & file(ii) & vbCrLf 'Chr(13) + Chr(10) Next MsgBox ss, , UBound(file) & "個のファイルが選択されました" End Sub追記1)ショートカットファイル名も取得する場合
'ショートカットファイル名も取得する場合の例 Sub test2_E97M047() Dim file As Variant, filter$, title$, ss$, ii&, lnk$ filter = "" title = "ファイル情報" file = Application.GetOpenFilename(filter, , title, , True) If VarType(file) = vbBoolean Then Exit Sub For ii = 1 To UBound(file) ss = file(ii) lnk = Dir(CurDir & "\*.lnk") Do While lnk <> "" If CreateObject("WScript.Shell").CreateShortcut(lnk).TargetPath = ss Then ss = lnk Exit Do End If lnk = Dir Loop '選択ファイルをイミディエイトウィンドウに出力 Debug.Print ii & ") "; IIf(Right(ss, 4) = ".lnk", Left(ss, Len(ss) - 4), ss) 'Debug.Print ii & ") "; ss Next End Sub追記2)関連項目
'GetSaveAsFilename メソッド '[名前を付けて保存]ダイアログボックスを表示しファイル名を取得します。取得のみで保存はされません。 Sub test3_E97M047() 'GetSaveAsFilenameの例 Dim file file = Application.GetSaveAsFilename(fileFilter:="すべてのファイル (*.*),*.*") If VarType(file) = vbBoolean Then Exit Sub MsgBox "選択されたファイル: " & file End Sub 'Openメソッド(ブックを開く) Workbooks.Open FileName:="c:\dat\Book1.xls" 'Saveメソッド 上書き保存 注:初めてブックを保存するときはSaveAsメソッドを使ってファイル名を指定します。 ActiveWorkbook.Save 'Saveメソッドの例(全ブックを保存してExcelを終了します) Sub test4_E97M047() Dim wb For Each wb In Application.Workbooks wb.Save '全ブックを保存 Next Application.Quit 'Excelを終了 End Sub 'Addメソッド(新しいブックを作成) Workbooks.Add 'SaveAsメソッド(名前を付けて保存) ActiveWorkbook.SaveAs FileName:="c:\dat\Book1.xls" 'Closeメソッド(オブジェクトを閉じる) Workbooks("Book1.xls").Close 'Book1.xlsを閉じる ActiveWorkbook.Close 'ActiveWorkbookを閉じる '確認無しのCloseを行う 'ブックの内容が更新されている場合は確認のダイアログ ボックスが表示されます。 '確認なしにブックを閉じる場合は引数SaveChangesにFalseを設定します。 Workbooks("Book1.xls").Close SaveChanges:=False '更新されていても保存の確認無しに閉じる注)ブックをVisualBasicから開いたり閉じたりする場合はAuto_OpenやAuto_Closeマクロは実行されません。Auto_xxxマクロを実行する場合は RunAutoMacrosメソッドを使います。
項目
内容説明
'セルB2の位置(座標)とサイズを表示するサンプル Sub test1_E97M046() Dim rg As Range, ss$ Set rg = Range("B2") ss = "Left=" & rg.Left & vbCrLf ss = ss & "Top=" & rg.Top & vbCrLf ss = ss & "Width=" & rg.Width & vbCrLf ss = ss & "Height=" & rg.Height MsgBox ss, , "セルB2の位置とサイズ" End Sub 'セルB2に同サイズのCommandButtonを作成するサンプル Sub test2_E97M046() Dim rg As Range Set rg = Range("B2") ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _ Left:=rg.Left, Top:=rg.Top, Width:=rg.Width, Height:=rg.Height).Select ActiveCell.Activate 'SendKeys "{ESC}", True End Sub '既存のCommandButton1をセルD4へ移動するサンプル Sub test3_E97M046() Dim rg As Range, sp As Shape Set rg = Range("D4") Set sp = ActiveSheet.Shapes("CommandButton1") sp.IncrementLeft rg.Left - sp.Left sp.IncrementTop rg.Top - sp.Top ActiveCell.Activate End Sub注)ActiveCell.Activateについて
項目
内容説明
For ii = 1 To 10 Controls("TextBox" & ii).Value = ii Next又はMeキーワードを使うことも出来ます。Meキーワードはクラスモジュール又はフォ−ム内のプロシージャ(Sub,Function)で使用できます。現在のフォーム(Formクラスの現在実行中のインスタンス)を表す変数と同様に動作します。
For ii = 1 To 10 Me("TextBox" & ii).Value = ii Next実際に配列にして扱うには次のようになります。
Dim ctl(10), ii& For ii = 1 To 10 Set ctl(ii) = Me("TextBox" & ii) ' Set ctl(ii) = Controls("TextBox" & ii) '標準モジュールではこちら Next ' For ii = 1 To 10 ctl(ii).Value = ii Nextワークシートに配置したコントロ−ルを配列として扱うには OLEObjectsコレクションを用います。
For ii = 1 To 10 ActiveSheet.OLEObjects("TextBox" & ii).Object = ii Next
項目
内容説明
'参照設定[Microsoft Form 2.0 Object Library] 'Windowsクリップボードへデータをコピーする '引数 dat:コピーするデータ Sub kPutClip(dat As String) With New DataObject 'IDataAutoWrapper .SetText dat .PutInClipboard End With End Sub 'クリップボードのデータを取り出す Function kGetClip() As String If Application.ClipboardFormats(1) <> xlClipboardFormatText Then Exit Function With New DataObject 'IDataAutoWrapper .GetFromClipboard kGetClip = .GetText End With End Function Sub a_E97M044() 'kPutClip関数とkGetClip関数のテスト kPutClip "Date" 'クリップボードへDateをコピー MsgBox kGetClip 'クリップボードから取り出し End Sub 追記1) クリップボードのクリア(API版) Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long Declare Function EmptyClipboard Lib "User32" () As Long Declare Function CloseClipboard Lib "User32" () As Long Function kEmptyClipboard() As Boolean OpenClipboard 0& kEmptyClipboard = EmptyClipboard() '正常終了->TRUE CloseClipboard End Function Sub test_kEmptyClipboard() 'kEmptyClipboard関数のテスト Debug.Print kEmptyClipboard End Sub 追記2) クリップボードのクリア(簡易版) 'ExcelマクロでWindowsクリップボードのクリア ActiveCell.Copy: Application.CutCopyMode = False
項目
内容説明
例1: Sheet1 B2 のデータをSheet2 B2 へコピー&貼り付け(すべて)する 'マクロの記録結果 Range("B2").Select Selection.Copy Sheets("Sheet2").Select Range("B2").Select ActiveSheet.Paste Sheets("Sheet1").Select Application.CutCopyMode = False '修正したコード Range("B2").Copy Worksheets("Sheet2").Range("B2") 例2: Sheet1 B2 のデータをSheet2 B2 へ形式を選択して貼り付け(値)する 'マクロの記録結果 Range("B2").Select Selection.Copy Sheets("Sheet2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("Sheet1").Select Application.CutCopyMode = False '修正したコード Worksheets("Sheet2").Range("B2").Value = Range("B2").Value 例3: Sheet1 B2 のデータをSheet2 B2 へ形式を選択して貼り付け(書式)する 'マクロの記録結果 Range("B2").Select Selection.Copy Sheets("Sheet2").Select Range("B2").Select Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False Sheets("Sheet1").Select Application.CutCopyMode = False '修正したコード ActiveSheet.Range("B2").Copy Worksheets("Sheet2").Range("B2").PasteSpecial Paste:=xlFormats Application.CutCopyMode = False 例4: 任意の名前のシートを作成する 'マクロの記録結果 Sheets.Add Sheets("Sheet3").Select Sheets("Sheet3").Name = "sss" '修正したコード Sheets.Add.Name = "sss" 例5: 選択したセルに罫線(格子枠)を引く '[書式]-[セル]-[罫線]で格子枠を点線、赤色に設定 'マクロの記録結果 Range("B2:D6").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlDash .Weight = xlThin .ColorIndex = 3 End With With Selection.Borders(xlEdgeTop) .LineStyle = xlDash .Weight = xlThin .ColorIndex = 3 End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlDash .Weight = xlThin .ColorIndex = 3 End With With Selection.Borders(xlEdgeRight) .LineStyle = xlDash .Weight = xlThin .ColorIndex = 3 End With With Selection.Borders(xlInsideVertical) .LineStyle = xlDash .Weight = xlThin .ColorIndex = 3 End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlDash .Weight = xlThin .ColorIndex = 3 End With '修正したコード With Range("B2:D6").Borders .LineStyle = xlContinuous .Weight = xlThin .Color = vbRed End With 'プロパティが既定値(.Weight = xlThin、.ColorIndex = xlAutomatic)の場合 Range("B2:D6").Borders.LineStyle = xlContinuous '応用 セル範囲の罫線を消去 Range("B2:D6").Borders.LineStyle = xlNone '応用 セル範囲の罫線を消去(隣接セルに罫線がある場合) Dim ii& For ii = xlDiagonalDown To xlEdgeRight Range("C4").Borders(ii).LineStyle = xlNone Next 例6: コメントの書式設定の一例 'コメントの書式を[フォント]-[スタイル]を"標準"に、[配置]-[自動サイズ調整]をするに設定 'マクロの記録結果 Range("A1").Comment.Text Text:="Comment" With Selection.Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 9 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With With Selection .HorizontalAlignment = xlLeft .VerticalAlignment = xlTop .Orientation = xlHorizontal .AutoSize = True .AddIndent = False End With '修正したコード Dim rg As Range Set rg = Range("A1") If rg.Comment Is Nothing Then rg.AddComment With rg.Comment .Shape.TextFrame.Characters.Font.FontStyle = "標準" .Shape.TextFrame.AutoSize = True .Text "Comment" End With 例7: 図形描画の例(1) '直線を描き、オートシェイプの書式設定-[色と線]タブ-[線]-[色]を変更 'マクロの記録結果 ActiveSheet.Shapes.AddLine(124.5, 42.75, 173.25, 96.75).Select Selection.ShapeRange.Line.Weight = 0.75 Selection.ShapeRange.Line.DashStyle = msoLineSolid Selection.ShapeRange.Line.Style = msoLineSingle Selection.ShapeRange.Line.Transparency = 0# Selection.ShapeRange.Line.Visible = msoTrue Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 '以下省略 '修正したコード With ActiveSheet.Shapes.AddLine(124.5, 42.75, 173.25, 96.75) .Line.ForeColor.SchemeColor = 10 End With 例8: 図形描画の例(2) 'オートシェイプの文字の編集 'マクロの記録結果 ActiveSheet.Shapes("AutoShape 1").Select Selection.Characters.Text = "abc" '修正したコード ActiveSheet.Shapes("AutoShape 1").TextFrame.Characters.Text = "abc" 例9: 図形描画の例(3) 'オートシェイプ文字のプロパティ設定 [図形挿入]-[テキスト追加]-[色を赤に]-[自動サイズ調整]をチェック 'マクロの記録結果 ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 20#, 10#, 20, _ 10#).Select Selection.Characters.Text = "TEST" With Selection.Characters(Start:=1, Length:=4).Font .Name = "MS Pゴシック" .FontStyle = "標準" .Size = 11 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = 3 End With With Selection .HorizontalAlignment = xlLeft .VerticalAlignment = xlTop .Orientation = xlHorizontal .AutoSize = True .AddIndent = False End With '修正したコード With ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 20, 10, 20, 10) With .TextFrame.Characters .Text = "TEST" .Font.Color = vbRed End With .Parent.DrawingObjects(.Name).AutoSize = True End With 例10: 図形描画の例(4) '全てのシートの図形オブジェクトを削除 'マクロの記録結果 '[オブジェクトの選択]で選択した場合 ActiveSheet.Shapes.Range(Array("AutoShape 1", "Rectangle 2")).Select Selection.Delete Sheets("Sheet2").Select '[ジャンプ]-[セル選択]-[オブジェクト]にて選択した場合 ActiveSheet.DrawingObjects.Select Selection.Delete Sheets("Sheet3").Select ActiveSheet.DrawingObjects.Select Selection.Delete Sheets("Sheet1").Select '修正したコード その1 '[ジャンプ]-[セル選択]-[オブジェクト]にて選択されるオブジェクトを削除 'シートの保護(オブジェクト)がされている場合はロックされていないオブジェクトが選択される '保護がされていない場合は全てのオブジェクトが選択される Dim ws As Worksheet For Each ws In ActiveWorkbook.Worksheets ws.DrawingObjects.Delete Next '修正したコード その2 'シートの保護(オブジェクト)に関わらず明視的にロックされていないオブジェクトのみを削除 Dim ws As Worksheet, sp As Shape For Each ws In ThisWorkbook.Worksheets For Each sp In ws.Shapes If sp.Locked = False Then sp.DrawingObject.Delete Next Next 例11: グラフの一例 '既存の散布図の[データ系列の書式設定]-[パターン]タブ-[マーカー]-[スタイル]を変更 'マクロの記録結果 ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.SeriesCollection(1).Select With Selection.Border .Weight = xlHairline .LineStyle = xlNone End With With Selection .MarkerBackgroundColorIndex = xlAutomatic .MarkerForegroundColorIndex = xlAutomatic .MarkerStyle = xlCircle .Smooth = False .MarkerSize = 5 .Shadow = False End With '修正したコード With ActiveSheet.ChartObjects("グラフ 1").Chart ' With .SeriesCollection(1) .MarkerStyle = xlCircle ' End With End With 例12: フォームのコントロールの書式設定の一例 '[フォーム]-[コンボボックス]の[コントロールの書式設定]-[コントロール]タブ-[入力範囲]を設定 'マクロの記録結果 ActiveSheet.Shapes("Drop Down 1").Select With Selection .ListFillRange = "$B$2:$B$10" .LinkedCell = "" .DropDownLines = 8 .Display3DShading = False End With '修正したコード With ActiveSheet.Shapes("Drop Down 1").DrawingObject 'With ActiveSheet.DropDowns("Drop Down 1") '←別法 .ListFillRange = "$B$2:$B$10" ' End With
項目
内容説明
'範囲A2:E10を指定する例(Cellsプロパティを用いる) Dim rg As Range, x1&, x2&, y1&, y2& x1 = 1: x2 = 5 y1 = 2: y2 = 10 With Worksheets("sheet1") Set rg = .Range(.Cells(y1, x1), .Cells(y2, x2)) End With 'Resizeプロパティを用いる方法 Set rg = Worksheets("sheet1").Cells(y1, x1).Resize(y2 - y1 + 1, x2 - x1 + 1) '決まった列の任意行を指定する例(B3) Dim rg As Range, y1& y1 = 3 '行 Set rg = ThisWorkbook.ActiveSheet.Range("B" & y1) '任意の行列を指定する例(C4) Dim rg As Range, x1&, y1& x1 = 3 'C列 y1 = 4 '4行 'Set rg = Range(Chr(Asc("A") - 1 + x1) & y1) '(但しA〜Z列範囲) Set rg = ActiveSheet.Cells(y1, x1) '列選択(C列)の例 Dim rg As Range, x1& x1 = 3 Set rg = Sheets("Sheet1").Columns(x1) '複数列選択(C:E列)の例 Dim rg As Range, x1&, x2& x1 = 3: x2 = 5 'C〜E列 'Set rg = Columns(Chr(Asc("A") - 1 + x1) + ":" + Chr(Asc("A") - 1 + x2)) '(但しA〜Z列範囲) Set rg = Columns(x1).Resize(, x2 - x1 + 1) '行選択(3行)の例 Dim rg As Range, y1& y1 = 3 Set rg = Sheets("Sheet1").Rows(y1) '複数行選択(3:5列)の例 Dim rg As Range, y1&, y2& y1 = 3: y2 = 5 '3〜5行 'Set rg = Rows(y1 & ":" & y2) Set rg = Sheets("Sheet1").Rows(y1).Resize(y2 - y1 + 1)
項目
内容説明
ActiveWindow.ScrollColumn = 5
ActiveWindow.ScrollRow = 10
ScrollColumn及びScrollRowプロパティは値の取得および設定ともに可能です。長整数型 (Long)の値を使用します。
ウィンドウ枠を固定している場合、Windowオブジェクトの固定領域は対象外となります。
ウィンドウを分割表示している場合、ScrollColumnプロパティは左上のウィンドウ枠が対象となります。
もう一つ、Gotoメソッドを使う方法もあります。
Application.Goto Range("E15"), True
Excel技<Excel Tips>−マクロ |