ExcelVBAの基本的な使い方をまとめました。
目次
----
Excelライブラリ
===================================
..Excelライブラリ
===================================
オブジェクトの階層構造
Application
WorksheetFunction
Workbooks
Windows
Charts(グラフシートに作成されるグラフオブジェクト)
WorkSheets
Rows
Columns
Range
Shapes
Charts(WorkSheetに作成される埋め込みグラフ)
ChartObjects
Charts(同上)
※ChartObjectsにShapesを代入したい場合
Set ChartObject1 = ActiveSheet.ChartObjects(Shape1.name)
Application
-----------
Applicationクラスの主なプロパティ
ActiveCell
ActivePrinter
ActiveSheet
ActiveWorkBook
Application
Calculation
Cells
Charts
Columns
DefaultFilePath
DisplayAlerts
DisplayStatusBar
EnableEbents
LibraryPath
Name
Path
PrintCommunication
Range
ReferenceStyle
Rows
ScreenUpdating
Selection
Sheets
StartupPath
StatusBar
TemplatesPath
ThisWorkbook
UserLibraryPath
UserName
Version
Visible
Workbooks
WorksheetFunction
Worksheets
Applicationクラスの主なメソッド
Calculate
CentimetersToPoints
ConvertFormula
Evaluate
GetPhonetic
Goto
InchesToPoints
InputBox
intersect
OnTime
Quit
Run
SendKeys
Union
Wait
Applicationクラスのオブジェクトを取得する主なプロパティ
Commandbars
FileDialog
VBE
Windows
Application.ScreenUpdating = False 描画停止
Application.EnableEvents = False イベント発生抑制
Application.Calculation = xlCalculationManual 自動計算停止
Application.Calculation = xlCalculationAutomatic
Application.Cursor = xlWait カーソル砂時計
Application.Cursor = xlDefault
Application.StatusBar = s ステータスバーにsを表示
Application.StatusBar = False ステータスバーをExcelのコントロールに戻す
Application.DisplayAlerts = False 警告・確認メッセージを表示しない
Application.DisplayAlerts = True
Application.wait time:= now + TimeValue("00:00:10")10秒スリープ、1秒以下はsleep
Application.wait time:= now + TimeSerial(0,0,10)
Application.OnTime(Now + TimeSerial(0,0,1), "Sub1")1行後にSub1を実行
Application.Max(2, 3, 4) Excel関数(全てが使えるわけではない)
Application.CountA() ' セル範囲に対して
WorksheetFunction.CountA() ' 単一セルに対して(ワークシート関数)
Application.WorksheetFunction.VLookup
If( Application.Calculation = xlCalculationManual ) Then
Application.Calculate 再計算
End If
Application.Goto Sheet(1).Cells(1,1), True セルを選択、カーソル移動とスクロール
Application.Dialogs(xlDialogPrint).Show 印刷ダイアログボックスを表示
Application.Workbooks
SendKeys
Application.SendKeys "p",True 第二引数をTrueとすると処理が終了するまで実行を一時中断
Application.SendKeys "^p" Ctrl + p(注意:小文字)
Application.SendKeys "%r" Alt + r
Application.SendKeys "%fx" Alt + f + x
Application.SendKeys "{TAB}" tab
Application.SendKeys "{TAB 5}" 同じキーを5回押す
Application.SendKeys "{ENTER}" テンキーのエンター(NumLockの状態に影響される)
Application.SendKeys "~" 通常のEnter
Application.SendKeys "+" shift
Application.SendKeys "+;" チェックボックスON(スペースの代わり)
Application.SendKeys "-" チェックボックスOFF
Application.SendKeys "{PGUP}"
Application.SendKeys "%{TAB}" Alt+Tab(画面切り替え)
SendKeys を実行するとNumLock キーがオフになるバグ
2つ以上の SendKeys が連続して実行されると、NumLock キーがオフになることがある(切り替わる)
(対処法)
WshShellのSendKeysを使う1
CreateObject("WScript.Shell").SendKeys "aa"
WshShellのSendKeysを使う2
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
WSH.SendKeys "a"
Set WSH = Nothing
WshShellのSendKeysを使う3
Private Sub wshSendKeys(Keys As String, Optional Wait As Boolean = False)
Static WSH As Object
If WSH Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
Call WSH.SendKeys(Keys, Wait)
End Sub
(バグへの対処法)
「NumLock」キーの状態を取得
Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
Dim keys(0 To 255) As Byte
GetKeyboardState keys(0)
Debug.Print keys(&H90) '「NumLock」キー
NumLockキーを押す
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
keybd_event &H90, &H45, &H1 Or 0, 0
keybd_event &H90, &H45, &H1 Or &H2, 0
※SendKeysでNumLockを押すと、その際にバグが発生する可能性があるためSendKeysを使わない
Sendkeysでは送信できないキーコード
プリントスクリーン(Print Screen)
API(keybd_event)を使う
アクティブ画面のプリントスクリーン(キャプチャー、スクリーンショット)を撮る
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
keybd_event &HA4, 0&, &H1, 0&
keybd_event vbKeySnapshot, 0&, &H1, 0&
keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
keybd_event &HA4, 0&, &H1 Or &H2, 0&
'その後、画面を切り替えてエクセルへ貼り付け(以下)
DoEvents
SendKeys "%{TAB}" 'Alt+Tab(画面切り替え)
Application.Wait Now() + TimeValue("00:00:01") '1秒待つ
ActiveSheet.Paste Destination:=Range("A4")
全画面のプリントスクリーンを撮る
keybd_event vbKeySnapshot, 0&, &H1, 0&
keybd_event vbKeySnapshot, 0&, &H1 Or &H2, 0&
zipファイルの解凍
Sub test()
Set WS_S = CreateObject("WScript.Shell")
WS_S.Run "c:\a.zip"
Application.Wait (Now + TimeValue("0:00:01"))
SendKeys "123" + "{enter}" '123がパスワード
Application.Wait (Now + TimeValue("0:00:03"))
SendKeys "{down}" + "{enter}"
Set WS_S = Nothing
End Sub
Application.Caller
押されたボタンのコントロール名の取得
フォームコントロールのボタン(ワークシート上)→正しく動く
AxtiveXのコマンドボタン(ワークシート上、ユーザーフォーム上)→エラー
Accessの場合は取得できないが、フォーカスのあるコントロール名を取得することで、代替できる場合もある
MsgBox ActiveControl.Name
Application.InputBox
一般的には、VBAライブラリのInputBox関数を使う(Application.が不要)
Workbooks,Wrokbook
------------------
Wrokbookクラスの主なプロパティ
Charts
FullName
HasPassWord
HasVBProject
IsAddin
Name
Parent
PassWord
Path
ReadOnly
ReadOnlyRecommended
Saved
Sheets
Worksheets
Wrokbookクラスの主なメソッド
Activate
Close
ExportAsFixedFormat
PrintOut
PrintPreview
Protect
Save
SaveAs
SavecopyAs
Unprotect
Wrokbookオブジェクトから取得できる主なオブジェクト
BuiltinDocumentProperties
Names
PivotTables
VBProject
Styles
Windows ブック内のすべてのウィンドウ
新規ブック作成
Dim b1 as workbook
Set b1 = Workbooks.Add '新規ブック
b1.Open Filename:="C:\a.xls"
Workbooks("a.xls").Save
b1.SaveAs "C:\a.xls"
b1.saveAs FileName = "a"
b1.Close
b1.Close SaveChanges:=False '保存せずに終了
WorkBooks("a.xls").Activate
うまく前面に出ないときは AppActivate ("Microsoft Excel") とする
AppActivate(book1.name & " - Excel") 'タイトルバーに表示されている文字列で指定
ActiveWindow.Visible = False '表示しない
book1.BuiltinDocumentProperties("Title") 組み込みプロパティの取得、設定
Title
Subject
Author
KeyWords
Comments
Template
Last author 最終更新者
Revision number
Application name
Last prit date
Creation date 作成日時
Last save time 更新日時
Category
Manager
Company
Hyperlink base
Content Status
IsAddin
Trueの場合
ブックをアドインとして扱われる
変更後、ブックの保存が要求されない
ウィンドウは表示されない
Falseの場合
通常のブックとして扱われる
アドイン(xlam)のシートを表示させる
VBA->ThisWorkbook->プロパティ->IsAddin=False
ThisWorkbook.IsAddin = False
Windows(ThisWorkbook.Name).Visible = True
アドインを保存する(アドインを表示(IsAddin = False)していてもエラーが起こらない処理)
buf = ThisWorkbook.IsAddin
ThisWorkbook.IsAddin = True
ThisWorkbook.Save
ThisWorkbook.IsAddin = buf
Window
------
Windows(1)
ActiveWindow
ActiveWindow.WindowState = xlNormal
ActiveWindow.Height = 200
ActiveWindow.Width
ActiveWindow.Top
ActiveWindow.Left
ActiveWindow.Zoom
ActiveWindow.ActiveCell
選択されているセルの中で、左上の白抜きになっているセル1つ
r1.Activateで設定
選択範囲外に設定すると選択範囲が解除される
ActiveWindow.ActiveChart
ActiveWindow.ActiveSheet
ActiveWindow.ActiveSheetView
ActiveWindow.SelectedSheets
ActiveWindow.ScrollRow = 30 行番号を指定して左右スクロール
ActiveWindow.ScrollColumn = 30 列番号を指定して上下スクロール
ActiveWindow.SmallScroll Down:=1 1行下にスクロール
ActiveWindow.LargeScroll Down:=1 1ページ下にスクロール
Up
ToRight
ToLeft
ActiveWindow.Goto(r1,True) アクティブにしてr1へ移動
第二引数がTrueだと移動先の左上端へスクロール
Worksheet,Sheets
----------------
SheetsとWorksheetsの違い
Sheets すべてのシート(グラフシート(Charts)を含む)
Worksheets グラフシート(Charts)を含まない
Sheetsはコレクションとしてのみ存在(個別のsheetオブジェクトとしては存在しない)
Sheetsクラスの主なプロパティ
Count
Item
Parent
Visible
Sheetsクラスの主なメソッド
Add
Copy
Delete
Move
PrintOut
PrintPreview
Select
Worksheetクラスの主なプロパティ
Cells
Columns
Index
Name
Next
Parent
Previous
Range
Rows
Type
UsedRange
Visible
Worksheetクラスの主なメソッド
Activate
Calculate
Copy
Delete
ExporAsFixedFormat
Move
Paste
PasteSpecial
PrintOut
PrintPreview
Protect
SaveAs
Select
Unprotect
Worksheetオブジェクトから取得できる主なオブジェクト
ChartObjects
Comments
Hyperlinks
ListObjects
Names
PageSetup
PivotTables
Shapes
Sort
Tab
Sheets(1)
Sheets("Sheet1")
Sheets(array("Sheet1", "Sheet2", "Sheet3"))
Sheets(array(1,3)) 複数シート
Sheets.Select 全シート
Sheets(1).Select False 選択の追加、追加選択
Sheets.Add 挿入シートがアクティブとなる、選択されたシートの前に挿入、複数シート選択時は複数コピー
Sheets.Add after:=Sheets(Sheets.Count) 末尾に
Sheets.Add before := Sheets(1) 先頭に
Set sh1 = Sheets.Add()
sheet1.Activate
sheet1.Delete Shift:=xlUp
sheet1.Name = "abc"
sheet1.Visible = False
xlSheetVeryHidden 2 非表示、メニューでシートを再表示することはできない
VBAからしか開けない(VBAにパスワードをかければ、開けなくなる)
sheet1.Delete
sheet1.Copy 新しいブックにコピーする
sheet1.Copy after:=Sheets(Sheets.Count) 末尾に
sheet1.Copy before := sheet1 先頭に
sheet1.Name = "a"
sheet1.PrintOut
sheet1.PrintPreview
sheet1.Rows.count 65536
複数シートの選択
Dim s() As String
ReDim s(1 To 10)
For i = LBound(s) To UBound(s)
s(i) = Sheets(i).Name
Next
Sheets(s).Select
Range
-----
Rangeクラスの主なプロパティ
Address
Areas
Cells
Column
Columns
ColumnWidth
Count
CountLarge
CurrentRegion
End
EntireColummn
EntireColumn
EntireRow
Formula
FomulaLocal
Formula
FormulaLocal
FormulaR1C1
FormulaR1C1Local
Height
Hidden
HorizontalAlignment
Item
MergeArea
MergeCells
Name
Next
NumberFormat
NumberFormatLocal
Offset
Orientation
Parent
Previous
Range
Resize
Row
RowHeight
Rows
ShrinkToFit
Text
Value
VerticalAlignment
Width
WrapText
Rangeクラスの主なメソッド
Activate
AutoFill
AutoFilter
AutoFit 行高の自動調整
Calculate
Clear
ClearComments
ClearContents
ClearFormats
ClearHyperlinks
Copy
Cut
Delete
ExportAsFixedFormat
Find
FindNext
Insert
Merge
PaseteSpecial
PrintOut
PrintPreview
RemoveDuplicates
Replace
Select
Sort
SpecialCells
UnMerge
Range
Set r1 = Range("A1")
Range("A" & i)
Range(Cells(1,3),Cells(1,3)) ×Range(Cells(1,3))
Range(Cells(1,3),Cells(5,3)) C1~C5の範囲
Range("C1","C5") ×Range("C1","C5","A10") 3項目以上は不可
Range(r1,r2)
Range("A1:B10") 範囲演算子:
Range("名前") 名前によるセル参照
[A1:B5].Select
r1(1) 左上、1番目のセル ※注意 rng(0)は範囲外(左横)を指す
r1(r1.count) 右下
r1(1,r1.count) 右上
r1.Cells(1,1) 左上
r1.End(xlDown) 最終行のセル(終端セル)
xlToLeft
xlToRigth
xlUp
xlDown
Cells(Rows.Count, 1).End(xlUp).Row 下端(ワークシートの最大行)から最終行を探す
Cells(1, Columns.Count).End(xlToLeft).Column 右端
r1.SpecialCells(xlLastCell)
最終セル
使用されている範囲(入力されている範囲)
歯抜け無視
罫線の範囲(部分的に罫線を引いている場合)
フィルタの影響あり
挿入や消去を行うと誤認される(保存すれば正しく認識される)
r1.CurrentRegion
r1が含まれるアクティブセル領域(空白列と空白行で囲まれた範囲)
書式設定(背景色や罫線)は無関係
歯抜けはよいが行抜けや列抜けはダメ
sh1.UsedRange
使用されているセル範囲
書式設定されているセルも含まれる(背景色や罫線)
歯抜けも含まれる
範囲の変更
r1.offset(1,1) 平行移動(行、列)
r1.offset(1)
r1.offset(,1)
結合セル内部からの移動は1セル単位ではない、結合単位で移動する
結合セル外部からの移動は1セル単位で移動する
Intersect(r1,r2,r3) 共通部分(積集合)
Union(r1,r2,r3) 加える(和集合)、差を取得するメソッドは無い
r1.Resize(5, 4) '5行4列(変更後の行数,列数)
結合セルの影響を受けない
r1.Resize(, 4) '横サイズのみ
r1.Resize(5) '縦サイズのみ
複合範囲(離れている複数のセル)
Set r1 = Union(Cells(1, 1), Cells(3, 3))
Debug.Print r1.Count 2
Debug.Print r1.Areas.Count 2
Debug.Print r1.Areas(1).Count 1
Debug.Print r1.Areas(2).Count 1
Debug.Print r1(1).Row 1
Debug.Print r1(2).Row 2(注意:r1(1)の1行下)
Debug.Print r1.Areas(1)(1).Row 1
Debug.Print r1.Areas(1)(2).Row 2(注意:r1(1)の1行下)
Debug.Print r1.Areas(2)(1).Row 3
Debug.Print r1.Areas(2)(2).Row 4(注意:r1.Areas(2)(1)の1行下)
複合範囲をFor、iで回すとややこしくなる
For Each cell1 In r1 とする方が良い
Unionが隣接したセルの結合の場合
r1.Areas.Count=1
r1.Areas(2) エラー
r1.Value = "ABC"
r1.Count セルの個数
r1.Clear 書式も消去
r1.ClearContents 内容のみ消去(書式はそのまま)
r1.Delete 削除(行、列が詰められる)
r1.Address "$A$5"
r1.Name "Sheet1!$A$5"
r1.Copy
r1.Copy Range("B1") ' コピーして貼り付け、クリップボードを経由しない
(以前のクリップボードの内容は消えるが、クリップボードに残らない)
r1.Copy Destination:= r2
コピー先が結合セルの場合 r1.Copy r2.Resize(4,1)
r1.Cut
r1.Cut Range("B1") ' 移動
クリップボードから貼り付け
r1.Select
ActiveSheet.Paste
Application.CutCopyMode = False
r1.value = r1.value ' 式→値に変換
r1.Resize(r2.rows.Count, r2.columns.Count).Value = r2.Value ' 書式なしで値貼り付け
値貼り付け
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
すべて xlPasteAll(既定) -4104
数式 xlPasteFormulas -4123
値 xlPasteValues -4163
書式 xlPasteFormats -4122
配列に格納
Dim v As Variant
v = r1
行
r1.Rows.Count、Rows().Count 行数
r1.Row 行番号(整数)
r1.Rows(1) 1行目
Cells(1,1).EntireRow 対象セルを含む行全体
r1.Rows(1).Cells(3)
Rows("2:5")
Rows(i & ":5")
Range(Rows(2), Rows(5)) 2~5行目(3、4行目を含む)
行挿入
Rows(2).Insert
Rows("2:3").Insert
Range("2:3").Insert
Range("2:3").Delete
行挿入の例
Application.CutCopyMode = False 行挿入の前に実行(コピーの挿入を打ち消すため)
Rows(2).Insert
行高
Range("2:2").RowHeight
複数行の場合はすべての行が同じ場合は1行の高さ、異なる場合はNull
Range("2:2").Height 複数行の場合は高さの合計、取得のみ
列
r1.Columns.Count、Columns().Count 列数
r1.Column 列番号(整数)
r1.Columns(1) 1列目
r1.Columns("A")
Cells(1,1).EntireColumn 対象セルを含む列全体
r1.Columns(1).Cells(3)
Columns("B:D")
Columns("2:5") ' エラー
Range(Columns(2), Columns(5)) '2~5列目(3、4列目を含む)
列挿入
Columns("A:C").Insert
Range("A:C").Insert
Columns("A:C").Delete
列幅
Columns(3).ColumnWidth = 30
Range("2:2").ColumnWidth
Find
Rows(2).Find("abc", , xlValues, xlWhole, , , True, True)
Cells.Find(What:="abc", LookIn:=xlValues, LookAt:=xlWhole).Font.Bold = True
引数
What:=検索文字列
After:=検索開始位置 指定したセルの次のセルから検索(省略した場合は左上)
LookIn:=xlFormulas=-4144|xlValues=-4163 数式、値(規定値=直前の設定)
LookAt:=xlWhole=1|xlPart=2 完全一致、部分一致(規定値=直前の設定)
SearchOrder:=xlByRows=1|xlByColumns=2 検索方向(規定値=直前の設定)
SearchDirection:=xlNext=1|xlPrevious=2 検索方向(規定値=xlNext=上から下)、xlPrevious下から上
MatchCase:=True|False 大文字小文字を区別する(規定値=False)
MatchByte:=True|False 半角全角を区別する(規定値=直前の設定)
If( Cells.Find("abc") Is Nothing ) Then 見つからなかった場合 Nothingを返す
Cells.Find("abc").Row 行番号 見つかった場合、Range(セル)を返す
Cells.Find("abc").Column
r As Range
Set r = Cells.Find("abc")
置換(a→b)
Cells.Replace What:="a", Replacement:="b", LookAt:=xlPart, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False, MatchByte:=False
What 検索文字列
Replacement 置換後の文字列
LookAt 完全一致=xlWhole
部分一致=xlPart
SeachOrder 列方向に検索=xlByColumns
行方向に検索=xlByRows
MatchCase 大文字と小文字を区別する=True、区別しない=False
MatchByte 半角と全角を区別する=True、区別しない=False
(注意点)
直前の設定が記憶されていて引き継ぐため、引数を省略しないこと
直前に検索場所=ブックが指定されていると、選択範囲以外も置換されるため注意する
その場合は、一旦、ダミーでシートを検索する
Range("A1").Find ("a")
What:=1と指定すると、数値の1、1.0、文字列の1が検索される(文字列の1.0は検索されない)(完全一致)
半角と全角を区別しなければ、文字列の1も検索される
検索場所=ブックを指定することはできないので、ループさせる
(直前の設定で検索場所=ブックが指定されているときは必ずしもループさせなくてもよい)
Dim sheet1 As Worksheet
For Each sheet1 In ActiveWorkbook.Worksheets
sheet1.Cells.Replace What:="a", Replacement:="b", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Next
置換件数を調べることはできないが、置換の前に検索することはできる
if(sheet1.Cells.Find("abc", , xlValues, xlWhole, , , True, True) Is Nothing)then msgbox "置換対象なし"
正規表現による置換
Dim reg
Set reg = CreateObject("VBScript.RegExp")
reg.pattern = "\(N=[0-9,]+\)"
reg.IgnoreCase = True 大文字小文字の区別を無視する
reg.Global = True 文字列全体を何度でも検索する
reg.Replace(.Cells,"") 検索対象, 置換後の文字列
印刷範囲
Set r1 = Range(sheet1.PageSetup.PrintArea)
sheet1.PageSetup.PrintArea = r1.Address
改ページプレビュー
ActiveWindow.View = xlPageBreakPreview
xlNormalView = 1
xlPageBreakPreview = 2
xlPageLayoutView = 3
改ページ
r1.PageBreak = xlPageBreakManual '上、左に改ページを設定
r1.PageBreak = xlPageBreakManual
r1.Rows(3).PageBreak = xlPageBreakManual
r1.Columns(3).PageBreak = xlPageBreakManual
Debug.Print r1.Columns(3).PageBreak
xlPageBreakManual '設定(手動改ページ)-4135
xlPageBreakNone '解除 -4142
改ページが設定されていない範囲に解除を実行してもエラーは発生しない
xlPageBreakAutomatic '自動改ページ(自動改ページの設定はエラー) -4105
sheet1.HPageBreaks '上に改ページ
sheet1.HPageBreaks.Add(r1)
Set sheet1.HPageBreaks(1).Location = r1 '設定
改ページが無いシートに対して実行するとエラー
設定できるのは手動改ページのみ
Set sheet1.HPageBreaks(1).Location = sheet1.Rows(3)
i = sheet1.HPageBreaks(1).Location.Row '取得は自動改ページ、手動改ページの両方
i = sheet1.HPageBreaks.Count
sheet1.VPageBreaks '左に改ページ
Set sheet1.VPageBreaks(1).Location = r1
i = sheet1.VPageBreaks(1).Location.Column '取得のみ
i = sheet1.VPageBreaks.Count
sheet1.ResetAllPageBreaks 'シート内の改ページをすべて解除
sheet1→sheet2へ改ページ位置をコピー
Dim h As HPageBreak
For Each h In sheet1.HPageBreaks
If (sheet1.Rows(h.Location.Row).PageBreak = xlPageBreakManual) Then
sheet2.Rows(h.Location.Row).PageBreak = xlPageBreakManual
End If
Next
印刷範囲が設定されていないと、改ページを設定できない(エラー発生)
セルの入力規則
Validation.Add(Type, AlertStyle, Operator, Formula1, Formula2)
Validation.Delete
Validation.Modify(Type, AlertStyle, Operator, Formula1, Formula2)
Validation.AlertStyle 無効なデータが入力されたときに表示するエラーメッセージ
xlValidAlertStop 1 停止
xlValidAlertWarning 2 注意
xlValidAlertInformation 3 情報
Validation.Application
Validation.Creator
Validation.ErrorMessage
Validation.ErrorTitle
Validation.Formula1
Validation.Formula2
Validation.IgnoreBlank
Validation.IMEMode
Validation.InCellDropdown
Validation.InputTitle
Validation.Operator
xlBetween 二つの数式が指定されている場合のみ使用可
xlEqual 等しい
xlGreater 次の値より大きい
xlGreaterEqual 以上
xlLess 次の値より小さい
xlLessEqual 以下
xlNotBetween 次の値の間以外(xlBetween同様に二つの数式が指定されている場合のみ使用可)
xlNotEqual 等しくない
Validation.Parent
Validation.ShowError
Validation.ShowInput
Validation.Type
xlInputOnly 0 すべての値
xlValidateWholeNumber 1 整数
xlValidateDecimal 2 小数点
○xlValidateList 3 リスト指定
xlValidateDate 4 日付指定
xlValidateTime 5 日時指定
xlValidateTextLength 6 文字列(長さ指定)
xlValidateCustom 7 ユーザ設定
Validation.Value
(使い方の例)
r1.Validation.Delete
r1.Validation.Add Type:=xlValidateList, Formula1:="a,b,c"
r1.Validation.ShowError = False '無効なデータが入力されたらエラーメッセージを表示する(デフォルトTrue)
r1.Validation.ShowInput = False 'セルの選択時にメッセージを表示する(デフォルトTrue)
r1.Validation.Modify Type:=xlValidateList, Formula1:="a,b,c" 修正
入力規則が未設定のセルに修正するとエラーが発生する
入力規則が設定されているかを調べるにはエラー処理を使う
(備考)
複数シートが選択されていると入力規則の設定時にエラーとなる
sheet1.Select 一旦シートの複数選択を解除する
「同じ入力規則が設定されたすべてのセルに変更を適用する」は別シートには適用されない
入力規則の貼り付け
r1.Copy
r2.PasteSpecial xlPasteValidation '形式を選択して貼り付け(入力規則)
Application.CutCopyMode = False
Cells
-----
Cells(1,3)
Cells(3) Cell(1,3)と同じ
セルへの代入
r1 = "ABC"
r1 = "5" 文字も数字として代入される
r1.Formula = "=A2+A3" 数式を代入
r1 = "=LEFT(""abc"",2)" 式の中のダブルコーテーション
r1.FormulaR1C1 = "=R1C1+R1C2" 相対形式で代入
※R1C1 参照形式
ツール->オプション->全般->R1C1参照形式を使用する
「R」がRow(行)、「C」がColumn(列)
=R1C2(絶対参照) →B2
=RC2(絶対参照) →今がC3ならB3
=R[-1]C[-2](相対参照)→今がC3ならA2
r1.Font.ColorIndex = 16
r1.WrapText = True 折り返して全体を表示する
r1.ShrinkToFit = False 縮小して全体を表示する
r1.Interior.ColorIndex = 34 背景色
r1.Interior.Color = RGB(220, 220, 220)
r1.Interior.Color = &HFFFF99 '#16進
r1.NumberFormatLocal = "ee" 表示形式設定
Shapes(1).TopLeftCell.Address ' オブジェクトの左上隅の位置するセル番地
セルの結合
r1.Merge セル結合
r1.MergeCells = True セル結合2
r1.UnMerge セル結合を解除
If(r1.MergeCells) 任意のセルが結合されているときにTrue
Set r1 = Cells(1,1).MergeArea 結合されている全てのセル範囲を返す
Application.DisplayAlerts = False 警告を非表示
格子状の罫線を引く
Cells.Borders(xlEdgeLeft).LineStyle = xlContinuous
Cells.Borders(xlEdgeTop).LineStyle = xlContinuous
Cells.Borders(xlEdgeBottom).LineStyle = xlContinuous
Cells.Borders(xlEdgeRight).LineStyle = xlContinuous
Cells.Borders(xlInsideVertical).LineStyle = xlContinuous
Cells.Borders(xlInsideHorizontal).LineStyle = xlContinuous
すでに異なる線種で罫線引かれている場合は、一旦、消去する
Cells.Borders(xlEdgeLeft).LineStyle = xlNone
空欄の判定
空欄 空文字"" 数値の0
If(Cells(1,1)="") Then True True False 空欄も空文字も""で判定できる
If(Cells(1,1)<>"") Then True True False 同上
通常は上記の2つを使う
下記の2つはややこしいので使わない
空欄 空文字"" 数値の0
If(Cells(1,1)="0") Then False False True
If(Cells(1,1)=0) Then True False True 注意点:空欄は数値の0と扱われる
備考(空欄や""を変数に一旦格納する場合)
空欄 空文字"" 数値の0
i = Cells(1,1) 0 エラー 0
s = Cells(1,1) "" "" 0 空欄も空文字も""でTrueとなる
variant1 = Cells(1,1) Stringと同じ
Selection
---------
if(Selection.Address = Selection.EntireColumn.Address ) 列全体が選択されている
if(Selection.Address = Selection.EntireRow.Address ) 行全体が選択されている
Characters
----------
Characters(2,3) ' 2文字目~4文字目(1スタート)
Characters(10) ' 10文字目以降
文字以外(数値や日付)の場合はエラーとなる
Characters(1, 1).Text = "aa"
Characters(1, 1).Delete
Characters(1, 1).Font.Italic = True
Characters(1, 1).Font.Bold = True
Characters(1, 1).Font.Size = 16
Characters(1, 1).Font.ColorIndex = 3
Characters(1, 1).Font.Color = RGB(255, 0, 0)
Characters(1, 2).Font.Color 1文字目、2文字目が異なる色の場合、Nullが返る
Characters(1, 256).Font.Color 256文字以上は、エラーとなる
Characters(1, 1).Count
Characters(1, 1).Text
Characters(1, 1).Delete
256文字以上残して文字列前半を消去しようとすると消去されない(理由不明、バグ?)
Characters(1, 1).Insert
Cells(1,1).Characters(1, 0).Insert ("あ") ' 書式を維持して文字を挿入
Cells(1,1).Characters(Start:=1, Length:=0).Insert ("あ")
選択されている文字列の位置を取得する方法
不可
セル内の文字列の一部を選択した状態でマクロ(VBA)を実行することができないため
Name
----
Dim n1 As Name
Rangeで定義しないこと(Nameでの定義と動作が異なるため)
Set n1 = Range("名前")
n1.Name.Delete '定義の削除
n1.Address '$A$1:$A$3
n1.Name '定義名
n1.RefersTo '=Sheet1!$G$3:$G$5
ListObjects
-----------
テーブル