項目
内容説明
'引数にセル又はセル範囲を指定した場合のサンプル
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>−マクロ |