MENU

ExcelVBAの基礎

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
-----------
テーブル
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

VBAの学習中です。

目次