開発者ツール ウィンドウに入る
2. モジュールの挿入を選択し、プロシージャを挿入してサブルーチンを選択します
Excel では、, データには、テキスト , 数値 , 日付値 , 論理値、エラー値の 5 つのタイプしかありません。 ただし、VBA の , データ型は Excel とまったく同じではありません。 VBA はデータの特性に応じて「Boolean」「boolean」「byte (バイト)」「integer (整数)」「高精度浮動小数点型」にデータを分割します。 (single) , 倍精度浮動小数点型 (double) , 通貨型 (currency) , 10 進数型 (10 進数) , 文字列型 ( string( string, ; xff09;,日付タイプ(日付)、オブジェクトタイプなど
変数の宣言 , は、実際には変数の名前と格納できるデータ型を指定することです , VBA で変数を宣言するには , 次のようないくつかの方法があります :< /p >
データ型変数は操作に参加します
2. オブジェクト変数は操作に参加します
複数の変数を宣言する場合は、次の形式でコードを記述できます:
2. 変数型宣言子を使用して変数型を定義できます
| データ型 | 型宣言文字 |
|---|---|
| Integer | % |
| Long | & |
| Single | ! |
| Double | # |
| currency | @ |
| string | $ |
スコープによる分割 , VBA の変数は、ローカル変数 , モジュール変数とパブリック変数に分割できます。
| スコープ | 説明 |
|---|---|
| 単一プロシージャ | プロセス内の dim または static ステートメントで宣言された変数 , スコープはプロセスです , つまり、変数を宣言するステートメントが配置されているプロセスのみがその変数を使用できます , そのような変数 &# xff0c; 呼び出されたローカル変数 |
| 個別モジュール | 最初のプロシージャの前に dim または private ステートメントで宣言された変数モジュール ,スコープは、ステートメントが変数を宣言しているモジュール内のすべてのプロシージャです ,つまり、モジュール内のすべてのプロシージャがその変数を使用できます, このような境界はモジュール レベル変数<と呼ばれます |
| すべてのモジュール | モジュールの最初のプロセスの前に public ステートメントで宣言された変数 , スコープはすべてのモジュールです&# xff0c ; つまり、モジュール内のすべてのプロセスがそれを使用できます , このような変数はパブリック変数 |
Dim arr(a,b) as Integer
ここに arr , という名前の配列があり、その形状は行 a、列 b です。
配列を宣言するとき、配列に入力するデータの数がわからない場合は、動的配列を使用できます。 配列を動的配列として宣言する場合、変数を直接使用することはできません。redim を使用して配列のサイズを変更する必要があります
Sub test()
a = Application.WorksheetFunction.CountA(rang("A:A"))
Dim arr() As String
ReDim arr(1 To a)
End Sub
Sub arraytest()
Dim arr As Variant
arr = Array(1, 2, 3, 4)
MsgBox "arr 配列の 2 番目の要素は次のとおりです:" & arr(1)
End Sub
2. Split 関数を使用して配列を宣言します
Sub arraytest()
Dim arr As Variant
arr = Split("イェフェン、コンコン、シャオユエ、老竹", ",")
MsgBox "arr 配列の 2 番目の要素は次のとおりです:" & arr(1)
End Sub
セル領域から直接配列を作成する
Sub arraytest()
Dim arr As Variant
Range("A1:C3").Value = 5
arr = Range("A1:C1").Value
Range("e1:G1").Value = arr
End Sub
Sub arraytest()
Dim arr As Variant
Range("A1:C3").Value = 5
arr = Range("A1:C1").Value
MsgBox "配列の最大インデックス番号は次のとおりです:" & UBound(arr)
End Sub
Sub arraytest()
Dim arr As Variant
Range("A1:C3").Value = 5
arr = Range("A1:C1").Value
MsgBox "配列の最小インデックス番号は次のとおりです:" & LBound(arr)
End Sub
Sub arraytest()
Dim arr(10, 100) As Integer
Dim a As Integer, b As Integer
a = UBound(arr, 1)
b = UBound(arr, 2)
MsgBox "最初の次元の最大インデックスは次のとおりです:" & a & Chr(13) & "2 番目の次元の最大インデックスは次のとおりです:" & b
End Sub
Sub arraytest()
Dim arr As Variant
arr = Array(1, 2, 3, 4)
Text = Join(arr)
MsgBox Text
End Sub
Sub arraytest()
Dim arr As Variant
arr = Array(1, 2, 3, 4, 5, 6, 7)
Range("A4:A11").Value = Application.WorksheetFunction.Transpose(arr)
End Sub
転置とは、配列に対して列変換を実行することです。 配列の内容がセルの長さを埋めるのに十分でない場合、余分なデータは NA 値で埋められます。 埋められるセルの数が配列の長さに足りない場合は、順番に埋められます。
Excel テーブルのデータが配列に渡されると、デフォルトで 2 次元配列が作成されますので、配列の値を取得するときは 2 つの値を渡す必要があります配列の場合のみ、添字の範囲外の警告が表示されます。 配列の最初の数値は行を指定し、2 番目の数値は列を指定します
arr = range("B1:C1").value
msgbox arr(1,2)
定数は、金利、税率、円周率などの固定データを保存するためによく使用されます。 **定数を宣言するときは、定数の名前、保存できるデータ型、および定数に保存されるデータも定義します。 ステートメントは次のとおりです:
const データ型としての確定的な数値名 = 定数に格NAされるデータ
変数の定義と同様に、プロセス内の const ステートメントで定義された定数はローカル定数と呼ばれ、定数を宣言するプロセスでのみ使用できます。
const ステートメントを使用してモジュール内の最初のプロシージャの前に定数を宣言すると、その定数はモジュール レベルの定数と呼ばれ、モジュール内のすべてのプロシージャでその定数を使用できます。 p>
宣言された定数をすべてのモジュールで使用できるようにするには、モジュールの最初のプロシージャの前に、public ステートメントを使用してそれをパブリック定数として宣言する必要があります。
オブジェクトとは、VBA コードを使用して操作および制御される物であり、名詞です。 VBA では、Excel ワークブック、ワークシート、セルなどがオブジェクトであり、グラフ、ピボット テーブル、画像などもオブジェクトであり、セルの境界線や挿入されたコメントもオブジェクトです...
コレクションは、同じタイプの複数のオブジェクトの総称であるオブジェクトでもあります。
各オブジェクトには属性があり、オブジェクトの属性は、このオブジェクトの内容または特性として理解できます。 オブジェクトとプロパティは相対的な用語です。 セルはフォントに関連したオブジェクトですが、 セルはワークシートに関連したプロパティです
メソッドはオブジェクトに対して実行されるアクションまたは操作であり、各オブジェクトには対応する 1 つ以上のメソッドがあります。 メソッドとプロパティの違いは、プロパティはサブオブジェクト、色、サイズなどのオブジェクトの内容または特性を返しますが、 メソッドは選択、アクティブ化などのオブジェクトに対する操作であることです。 >
| 演算子 | アクション | 例 |
|---|---|---|
| + | 2 つの数値の合計を求める | 5+9=14 |
| - | 差2 つの数値の間、または数値の反対 | 8-3=5 |
| * | 2 つの数値の積を見つける | |
| / | 2 つの数値の商を求める | |
| \ | 数値を結んだ商の整数を求めます | 5\2=2 |
| ^ | 特定の数の累乗を求めます | |
| Mod | 2 を求めます。数字の割り算 | 12 mod 9 =3 |
| 演算子 | 関数 | 構文 | 戻り結果 |
|---|---|---|---|
| = | 2 つのデータが等しいかどうかを比較 | expression1=expression2 | 等しい場合は TRUE を返し、等しくない場合は false を返します |
| <> | 等しくない | 式1<>式2 | 反対 |
| > | 2 つの数値の大きさを比較 | expression1>expression2 | |
| >= | 2 つの数値の大きさを比較 | expression1>=expression2 | |
| < | 2 つの数値の大小を比較します | expression1<expression2 | |
| <= | 2 つの数値の大きさを比較 | expression1<=expression2 | |
| は | 2 つのオブジェクトの参照変数を比較します | オブジェクト 1 はオブジェクト 2 です | オブジェクト 1 とオブジェクト 2 が同じオブジェクトを参照する場合に TRUE を返しますそれ以外の場合は false を返します |
| like | 2 つの文字列が一致するかどうかを比較します | 文字列 1 が文字列 2 のように一致する | は返しますstring1 が string2 と一致する場合は TRUE、それ以外の場合は false |
| ワイルドカード | 関数 | コード例 |
|---|---|---|
| * | 任意の数の文字を置き換えます | 「李家俊」を「李*」のように |
| ? | 任意の 1 文字を置き換えます | 「李家俊」を「李??」のように |
| # | 任意の 1 文字を置き換えます | “Commodity 5” like “Commodity#” |
| [charlist] | charlist 内の任意の文字を置換します | “I” like “[A-Z]” |
| [!charlist] | 文字リストにない文字を置換します | “I” like “[!A-Z]” |
| 演算子 | 関数 | ステートメント形式 | 計算ルール |
|---|---|---|---|
| and | 論理 AND 演算を実行します | 式 1 and 式 2 | 式 1 の値と式 2 の値が両方とも同じである場合TRUE、TRUE を返し、それ以外の場合は false を返します |
| or | 論理「OR」演算を実行します | 式 1 or 式 2 | 2 つのうち 1 つが true で TRUE を返し、同時に false で false を返す |
| not | 論理的な " を実行します。 not" 演算 | not | 逆演算 |
| xor | 論理的な「排他的論理和」演算を実行します | 式 1 xor 式 2 | 式 1 と式 2 で返される値が異なる場合は TRUE を返し、それ以外の場合は false を返します |
| eqv | 論理的な「同等の」演算を実行します | 式 1 eqv 式 2 | 式 1 が TRUE と評価され、式 2 が False と評価された場合は false を返し、それ以外の場合は TRU を返します。 |
関数はたくさんありますが、それほど正確に覚える必要はありません。 **ある関数のおおよそのスペルを覚えていれば、コードを書くときに[コードウィンドウ]に「VBA.」と入力するだけで、システムが表示する関数一覧から使いたい関数を選択できます。 。
VBA では、if ステートメントの規則は次のとおりです。
if 条件 then ステートメント else 条件
if文を使えば「たくさんある中から一つを選ぶ」という問題は解決できますが、判定の選択条件が多すぎる場合、elseif文やif文を複数使うのは、一文の中でifを多用するのと同じで、コードのロジックを理解することが難しくなります。 通常、3 つ以上の戦略から選択する必要がある場合、問題を解決するために select case ステートメントを使用することを選択します
Sub test()
Select Case Range("B2").Value
Case Is >= 90
Range("C2").Value = "素晴らしい"
Case Is >= 80
Range("C2").Value = "良い"
Case Is >= 60
Range("C2").Value = "合格"
Case Is < 60
Range("c1").Value = "失敗した"
End Select
End Sub
VBA で for ループを定義するための構文規則は次のとおりです。
for ループ変数=初期値 to 終了値 step ステップ値
ループ本体
next ループ変数名
for ループは next で終了する必要があります
Sub test()
Dim irow As Byte
Dim i As Byte
For i = 1 To 10 Step 1
Select Case Range("B" & i).Value
Case Is > 100
Range("C" & i).Value = "エラー"
Case Is >= 90
Range("C" & i).Value = "素晴らしい"
Case Is >= 80
Range("C" & i).Value = "良い"
Case Is >= 60
Range("C" & i).Value = "合格"
Case Is < 60
Range("C" & i).Value = "失敗した"
End Select
Next i
End Sub
配列の各要素またはコレクションの各メンバーをループする必要がある場合は、for each...next ステートメントを使用します。
Sub test()
Dim i As Byte
j = 1
For Each sht In Worksheets
Range("D" & j).Value = sht.Name
j = j + 1
Next sht
End Sub
do while文は2種類に分けられ、ループ条件を設定する位置により先頭判定タイプと切り捨て判定タイプに分けられます。 ステートメントの構造は次のとおりです。
始まりの審判
do [while ループ条件]
ループ本体
exit do
ループ本体
loop
検閲された判定式
do
ループ本体
exit do
ループ本体
loop [while ループ条件]
各 do ステートメントはループで終わる必要があります。ループがループに到達すると、条件が true かどうかを判断するために do ステートメントに戻ります。
Sub test()
Dim i As Byte
i = 1
Do
Worksheets.Add
i = i + 1
Loop While i < 5
End Sub
goto ステートメントに対象となるターゲット ステートメントを明確に知らせるには、ターゲット ステートメントの前にコロン付きのテキスト文字またはコロンなしの数値ラベルを追加してから、goto ステートメントを書き込みます。その後のタグ名
Sub test()
Dim i As Integer
Dim sum As Long
i = 1
x: mysum = mysum + i
i = i + 1
If i <= 100 Then GoTo x
MsgBox "1 から 100 までの合計は次のとおりです:" & mysum
End Sub
同じオブジェクトに対して複数の操作を実行する必要がある場合、繰り返しコードを記述することがよくあります。 同じステートメントを複数回繰り返したくない場合は、with ステートメントを使用して簡素化できます。
Sub fontest()
With Worksheets("Sheet1").Range("A1").Font
.Name = "イミテーションソングフォント"
.ColorIndex = 3
.Bold = True
.Size = 12
End With
End Sub
[private|public|static] sub プロシージャ名([パラメータリスト])
ステートメントブロック
[exit sub]
ステートメントブロック
end sub
private または public は、プロセスのスコープを宣言するために使用されます。同時に使用できるのは 1 つだけであり、省略できます。省略した場合は、デフォルトで public が使用されます。 静的が選択されている場合、プロセスの実行終了後も、プロセス内の変数の値は引き続き保存されます
プロシージャ名を直接使用してプロシージャを呼び出し、プロシージャ名とパラメータを英語のカンマで区切ります
subname,arg1,arg2
sub runsub()
subadd
end sub
call キーワードを使用してプロセスを呼び出します。パラメータはプロセスのかっこ内に記述され、さまざまなパラメータはカンマで区切られます。
call プロセス名(args,arg2)
sub runsub()
call subadd
end sub
applicationation オブジェクトの run メソッドを使用してプロセスを呼び出します
application.run "subname,arg1,arg2"
sub runsub()
application.run "subadd"
VBA では、プロシージャ パラメータの受け渡しには、参照による受け渡しと値による受け渡しの 2 つの主な形式があります。 デフォルトでは、 プロシージャはパラメータを参照によって渡します。 プログラムがパラメータを参照渡しする場合、データが保存されているメモリ アドレスのみが渡され、プロセス中にパラメータを変更すると元のデータに影響します。
Sub shtadd(shtcount As Integer)
Worksheets.Add Count:=shtcount
shtcount = 8
MsgBox "shtcount の値:" & shtcount
End Sub
Sub test()
Dim c As Integer
c = 2
Call shtadd(c)
MsgBox "パラメータ プロシージャの値は次のとおりです:" & c
End Sub
public function 関数名([パラメータ])
関数本体
関数名 = 結果
end function
function プロシージャに含まれるコードの量や実行する計算の数に関係なく、最終的な計算結果はプロシージャ名に保存される必要があります。これは、他の言語での関数の戻り内容に相当します。
Excel での使用:
定義された関数がプライベート プロシージャとして定義されていない場合は、【関数の挿入】を使用して Excel でカスタム関数を使用できます。
Public Function fun()
fun = Int(Rnd() * 10) + 1
End Function
VBA プロセスで使用する
Sub test()
MsgBox fun()
End Sub
Public Function count_color(arr As Range, c As Range)
Dim rng As Range
For Each rng In arr
If rng.Interior.Color = c.Interior.Color Then
count_color = 1 + count_color
End If
Next rng
End Function
ワークシートが再計算されるときに、カスタム関数が再計算されない場合があります。 ワークシートの再計算後にカスタム関数を再計算したい場合は、カスタム関数を揮発性関数として定義する必要があります。 カスタム関数を揮発性関数として定義するには、関数プロセスの先頭に次のコード行を追加するだけです:
application.voliatile true
example
Public Function fun()
application.voliatile true
fun = Int(Rnd() * 10) + 1
End Function
| オブジェクト | オブジェクトの説明 |
|---|---|
| Application | Excel アプリケーションを表します ( Word で VBA が使用されている場合、Word アプリケーションを表します ) |
| Workbook | Excel の作業を表しますBook、ワークブック オブジェクトはワークブック ファイルを表します |
| worksheet | は Excel ワークシートを表します、ワークシート オブジェクトはワークブック内の通常のワークシートを表します |
| range | は Excel のセルを表し、単一のセルまたはセル領域になります。 |
アプリケーション オブジェクトの ScreenUpdating プロパティは、画面の更新を制御するスイッチです。 false に設定すると、画面は更新されず、各ステップの実行結果は表示されません。
Sub test()
Application.ScreenUpdating = False
Range("A1:A10").Value = 10
MsgBox "今入力した結果は 10 ですが、見ましたか?"
Range("A1:A10").Value = 100
MsgBox "今入力したのは 100 ですが、見ましたか?"
Application.ScreenUpdating = True
End Sub
Excel で特定の操作を実行すると、Excel に警告ボックスが表示されます。これらの操作を実行するかどうかを判断してください。 さまざまな理由から、Excel ではプログラムの実行中に同様の警告ダイアログ ボックスが表示されないことを望んでいます。これは、アプリケーション オブジェクトの displayalerts プロパティを false に設定することで実現できます。
Sub sheettest()
Worksheets.Add Count:=5
Application.DisplayAlerts = False
Dim sht As Worksheet
For Each sht In Worksheets
If sht.Name <> ActiveSheet.Name Then
sht.Delete
End If
Next sht
Application.DisplayAlerts = True
End Sub
VBA には多くの組み込み関数があり、関数を適切に使用すると、作業上の多くの問題を効果的に軽減し、コード作成の作業負荷を軽減できます。 ただしVBA には Excel の組み込み関数は存在せず、Excel の組み込み関数は worksheetfunction を使用して呼び出すことができます。
Sub cunt()
Dim mycount As Integer
Range("A1:B10").Value = 101
mycount = Application.WorksheetFunction.CountIf(Range("A1:B10"), ">100")
MsgBox "この領域にある 100 を超えるセルは次のとおりです:" & mycount
End Sub
VBA に同じ関数がすでに存在する場合、worksheetfunction 属性を使用してワークシート内の関数を参照することはできなくなります。 また、すべてのワークシート関数が worksheetfunction 属性を通じて呼び出せるわけではありません
アプリケーション オブジェクトのプロパティを設定して Excel のインターフェイスを変更する
| [イミディエイト ウィンドウ] で実行されたコード | 変更された領域 |
|---|---|
| application.caption = "My Excel" | タイトル バー |
| application.caption "miscrosoft Excel" | タイトル バー |
| application.displayformulabar = false | 数式バー |
| application.displaystatusbar = false | ステータス バー |
| application.statusbar = "編集中..." | ステータス バー |
| application.statusbar = false | ステータス バー |
| activewindow.displayHeadings = false | 行と列の見出し |
アプリケーション オブジェクトの共通属性
| プロパティ | 返されたオブジェクト |
|---|---|
| ActiveCell | 現在のアクティブ セル |
| ActiveChart | 現在アクティブなワークブック内のアクティブなグラフ |
| Activesheet | 現在アクティブなワークブックのアクティブ シート |
| ActiveWindow | 現在アクティブなウィンドウ |
| ActiveWorkbook | 現在アクティブなワークブック |
| Charts | 現在のアクティブなワークブック内のすべてのグラフ ジョブ シート |
| selection | 現在アクティブなワークブックで選択されているすべてのオブジェクト |
| sheets | すべてのシート現在アクティブなワークブック内のオブジェクト (通常のワークシート、グラフ ワークシート、Excel4.0 マクロ ワークシート、および 5.0 ダイアログ ワークシートを含む) |
| worksheets | すべてのワークシート オブジェクト現在アクティブなワークブック(共通ワークシート) |
| workbooks | 現在すべての開いているワークブック |
sub test()
workbooks(3)
workbooks("sheet1")
end sub
Sub info()
Range("c1") = ThisWorkbook.Name
Range("C2") = ThisWorkbook.Path
Range("C3") = ThisWorkbook.FullName
End Sub
workbooks.add
workbooks.add template:="D:\file\template.xlsm"
workbooks.add template := xlWBATChart '新しく作成したワークブックにグラフ ワークシートを含めます
add メソッドのパラメータを使用して、新しいワークブックに含まれるワークシートのタイプを指定します
| パラメータ値 | ワークブックに含まれるワークシート タイプ |
|---|---|
| xlWBATWorksheet | 共通ワークシート |
| xlWBATChart | グラフ ワークシート |
| xlWBATExcel4Macrosheet | 4.0 マクロ シート |
| xlWBATExcel4IntlMacrosheet | 5.0 ダイアログ シート |
workbooks.open filename := "path"
workbooks("workbooks_name").activate
thisworkbooks.save
thisworkbooks.saveas filename:="path"
thisworkbooks.savecopyas filename :="path"
workbooks.close '現在開いているワークブックをすべて閉じます
workbooks("workbooks_name").close '指定した名前のワークブックを閉じます
workbooks.close savechanges := true 'ワークブックを閉じて変更を保存します
worksheets.add
worksheets.add before|after := worksheet_name
worksheets.add count:=number
worksheets("worksheet_name").name = name
worksheets('worksheet_Name').delete
worksheets("worksheet_name").avtivate
worksheets("worksheet_name").select
worksheets('worksheet_name').copy before|after :=worksheet_name
worksheets("worksheet_name").copy
worksheets('worksheet_name').move before|after :=worksheet_name
worksheets("worksheet_name").move
worksheets("worksheet_name").visible =False or True
worksheets.count
range("A1:C1")
range("A1:A10,E6,E7:C12").select
range("B1:B10 A4:D6").value
range("B6:B10","D2:D8")
activesheet.cells(3,4) ‘3 行目 4 列目で交差するセル D3 を選択します’
range("B3:F9").cells(2,3)=10 'B3:F9 領域の行 2 と列 3 の交点に 100 を入力します'
range(cells(1,1),cells(5,14)).select 'A1:D5領域を指定'
activesheet.cells(2).value=200 'ワークシートの 2 番目のセルを 200 として指定します'
VBA では、行はワークシートまたは特定の領域内のすべての行のセットを表します。ワークシートの概要で指定された行を参照するには、行番号またはインデックス番号を使用できます。
activesheet.rows("3:3").select 'アクティブなシートの 3 行目を選択します'
activesheet.rows("3:5").select 'アクティブなシートの行 3 ~ 5 を選択します'
activesheet.rows(3) 'アクティブなシートの 3 行目を選択します'
VBA では、列はワークシートまたは特定の領域内のすべての行のコレクションを表します。ワークシート内の指定した行を参照するには、行番号またはインデックス番号を使用できます。
activesheet.columns("F:G").select 'アクティブなシートの列 F ~ G を選択します'
activesheet.columns(3) 'アクティブなシートの列 6 を選択します'
アプリケーション オブジェクトの Union メソッドは、パラメータで指定された複数のセル領域を結合した領域を返します。このメソッドを使用すると、複数の範囲オブジェクトを結合してバッチ操作を行うことができます。
application.union(range("A1:A10"),range("D1:D5")).select '2 つの領域を同時に選択します'
offset 属性を使用すると、指定したセル領域に対して特定のオフセット位置にあるセル領域を取得できます。 offset には 2 つのパラメータがあり、この属性の親オブジェクトによって上下または左右の方向にオフセットされる行と列の数を設定するために使用されます
range("B2:C3").offset(5,3).value=200 'B2:C3 エリアを右に 3 セル、下に 5 セル移動します'
範囲オブジェクトのサイズ変更属性を使用すると、指定したセル領域を意図的に拡大または縮小して、新しいセル領域を取得できます。
range("B2").resize(4,5) 'B2エリアを4行5列のエリアに拡張します'
range("B2:E6").resize(2,1) '元の領域を2行1列の領域に縮小します'
ワークシート オブジェクトの usedrange プロパティは、ワークシートで使用されているセルで囲まれた長方形の領域を返します。usedrange プロパティは、空の行、空の列、または空があるかどうかに関係なく、常に長方形の領域を返します。これらの領域の細胞
activesheet.usedrange.select 'アクティブなワークシートですでに使用されているセルの範囲を選択します'
range オブジェクトの currentregion プロパティは、指定されたセルを含む連続した長方形の領域を返します。空の行とその下の領域、空の列と右側の領域は currentregion の領域には含まれません強い>
range("B5").currentregion.select
範囲オブジェクトの end 属性は、指定されたセルを含む範囲の末尾のセルを返します。返される結果は、セル内で [enter+矢印キー] を押して取得したセルと等価です。
range("C5").end(xlUP).address
end パラメータと説明
| 設定可能なパラメータ | パラメータの説明 |
|---|---|
| xlToLeft | セル内で [end+左矢印キー] を押すのと同じです |
| xlToRight | セル内で [end+右矢印キー] を押すのと同じですセルキー] |
| xlUp | セル内で[end+上矢印キー]を押すのと同じです |
| xlDown | セル内で [end+下矢印キー] を押すのと同じです |
range("A1:B2").value="abc"
range("B4:F10").count
range("B4:F10").rows.count
range("B4:F10").columns.count
msgbox "現在選択されているセルのアドレスは"&selection.address
activesheet.range("A1:F5").activate
activesheet.range("A1:F5").select
コピーされるセルの数に関係なく、destination パラメータで指定する必要があるのは左上のセルの座標のみです
range('region').copy destination:=range("other_region")
何個のセルが切り取られても、destination パラメータで指定する必要があるのは左上のセルの座標だけです。
range('region').cut destination:=range("other_region")
範囲オブジェクトの delete メソッドを呼び出すと、指定したセルを削除できますが、手動でセルを削除する場合や、VBA コードを使用してセルを削除する場合とは異なり、Excel では [削除] ダイアログ ボックスは表示されません。 指定したセルを削除した後、Excel に自分の希望に従って他のセルを処理させたい場合は、Excel に意図を伝える VBA コードを記述する必要があります。 B3 が配置されているセルの行全体を削除する場合は、次のようにコードを記述する必要があります。
range("B3").entirerow.delete
VBA を使用してニーズを満たすワークブックを作成し、指定したディレクトリに保存します。
Sub wbadd()
Dim wb As Workbook
Dim sht As Worksheet
Set wb = Workbooks.Add
Set sht = wb.Worksheets(1)
With sht
.Name = "スタッフ名簿"
End With
wb.SaveAs ThisWorkbook.Path & "スタッフ名簿.xlsx"
ActiveWorkbook.Close
End Sub
Sub isopen()
Dim i As Integer
For i = 1 To Workbooks.Count
If Workbooks(i).Name = "得点表.xlsx" Then
MsgBox "ファイルが開いています"
Exit Sub
End If
Next
MsgBox "ファイルが開いていません"
End Sub
Sub isexist()
Dim fil As String
fil = ThisWorkbook.Path & "\スタッフ名簿.xlsx"
If Len(Dir(fil)) > 0 Then
MsgBox "ファイルが存在しています"
Else
MsgBox "ファイルが存在しません"
End If
End Sub
Sub wbinput()
Dim wb As String, xrow As Integer, arr
wb = ThisWorkbook.Path & "\スタッフ名簿.xlsx"
Workbooks.Open (wb)
With ActiveWorkbook.Worksheets(1)
xrow = .Range("A1").CurrentRegion.Rows.Count + 1
arr = Array(xrow - 1, "jack", "男", #7/8/1987#, #9/1/2010#, "新入社員になって10年目")
.Cells(xrow, 1).Resize(1, 6) = arr
End With
ActiveWorkbook.Close savechanges:=True
End Sub
Sub shtvisible()
Dim sht As Worksheet
For Each sht In Worksheets
If sht.Name <> ActiveSheet.Name Then
sht.Visible = xlSheetVeryHidden
End If
Next
End Sub
Sub shtadd()
Dim i As Integer
Dim sht As Worksheet
i = 1
Set sht = Worksheets("Sheet11")
Do While sht.Cells(i, "E") <> "
Worksheets.Add after:=Worksheets(Worksheets.Count)
ActiveSheet.Name = sht.Cells(i, "E").Value
i = i + 1
Loop
End Sub
Sub fenlie()
Dim i As Long, bj As String, rng As Range
i = 1
bj = Worksheets("Sheet11").Cells(i, "C").Value
Do While bj <> "
Set rng = Worksheets(bj).Range("A1048576").End(xlUp).Offset(1, 0)
Worksheets("Sheet11").Cells(i, "A").Resize(1, 7).Copy rng
i = i + 1
bj = Worksheets("Sheet11").Cells(i, "C").Value
Loop
End Sub
Sub hebing()
Dim sht As Worksheet
Set sht = Worksheets("Sheet11")
sht.Rows.Clear
Dim wt As Worksheet, xrow As Integer, rng As Range
For Each wt In Worksheets
If wt.Name <> "Sheet11" Then
Set rng = sht.Range("A1048576").End(xlUp)
xrow = wt.Range("A1").CurrentRegion.Rows.Count
wt.Range("A1").Resize(xrow, 7).Copy rng
End If
Next
End Sub
Sub savetofile()
Application.ScreenUpdating = False
Dim folder As String
folder = ThisWorkbook.Path & "\クラスレポートシート"
If Len(Dir(folder, vbDirectory)) = 0 Then
MkDir folder
End If
Dim sht As Worksheet
For Each sht In Worksheets
If sht.Name <> "Sheet11" Then
sht.Copy
ActiveWorkbook.SaveAs folder & "\" & sht.Name & ".xlsx"
ActiveWorkbook.Close
End If
Next
Application.ScreenUpdating = True
End Sub
Sub hzwb()
Dim bt As Range, r As Long, c As Long
r = 1
c = 7
Dim wt As Worksheet
Set wt = ThisWorkbook.Worksheets(1)
wt.Rows(r & ":1045876").ClearContents
Application.ScreenUpdating = False
Dim filename As String, sht As Worksheet, wb As Workbook
Dim erow As Long, fn As String, arr As Variant
filename = Dir(ThisWorkbook.Path & "\*.xlsx")
Do While filename <> "
If filename <> ThisWorkbook.Name Then
erow = wt.Range("A1").CurrentRegion.Rows.Count
fn = ThisWorkbook.Path & "\" & filename
Set wb = GetObject(fn)
Set sht = wb.Worksheets(1)
arr = sht.Range(sht.Cells(r, "A"), sht.Cells(1048576, "B").End(xlUp).Offset(0, 5))
wt.Cells(erow, "A").Resize(UBound(arr, 1), UBound(arr, 2)) = arr
wb.Close savechanges:=True
End If
filename = Dir
Loop
Application.ScreenUpdating = True
End Sub
Sub mulu()
Dim wt As Worksheet
Set wt = Worksheets("Sheet11")
wt.Rows("1:1048576").ClearContents
Dim sht As Worksheet, irow As Integer
irow = 1
For Each sht In Worksheets
If sht.Name <> "Sheet11" Then
wt.Cells(irow - 1, "A").Value = irow - 1
wt.Hyperlinks.Add anchor:=wt.Cells(irow - 1, "B"), Address:=", SubAddress:="'" & sht.Name & "'!A1", TextToDisplay:=sht.Name
End If
irow = 1 + irow
Next
End Sub
パラメータ anchor はハイパーリンクの場所を指定し、address はハイパーリンクのアドレスを指定し、subaddress はハイパーリンクのサブアドレスを指定し、TexttoDisplay はハイパーリンクの表示に使用されるテキストを指定します。
イベントがリリースされた後に自動的に実行されるプロセスをイベント プロセスと呼びます。イベント プロセスはサブプロセスでもあります。 サブプロセスとは異なり、タイムプロセスのスコープ、プロセス名、パラメータは当社が設定する必要はなく、また任意に設定することもできません。 時間プロセスのプロセス名は常にオブジェクト名と時間名で構成され、オブジェクトが前、イベントが後ろになり、両者はアンダースコアで結ばれます。
ワークシート イベントは、ワークシート オブジェクトで発生するイベントです。ワークブックには複数のワークシート オブジェクトが含まれる場合があり、ワークシート イベント プロセスは対応するワークシートに書き込む必要があります。プロセスが配置されているワークシート オブジェクト内の操作のみがイベントをトリガーできます。対応するイベント。
ワークシート オブジェクトの変更イベントは、プロシージャが配置されているワークシート内のセルが変更されたときにプログラムを自動的に実行するように VBA に指示します。
通常、この方法でイベント処理を記述します。[コード ウィンドウ]の[オブジェクト]リスト ボックスと[イベント]リスト ボックスで、対応するオブジェクトとイベント名を 1 つずつ選択し、 VBA が自動的に実行します イベント プロセスのスコープ、プロセス名、パラメータ情報を設定します
セル変更時に自動実行
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address & "に変更されました" & Target.Value
End Sub
一部のセルが変更されたときに自動的に実行します
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 1 Then
Exit Sub
End If
MsgBox Target.Address & "に変更されました" & Target.Value
End Sub
イベントを無効にすると、操作の実行後にイベントが発生しなくなります。 VBA では、アプリケーション オブジェクトの EnableEvents プロパティを false に設定して、イベントを無効にすることができます。
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Target.Offset(0, 1).Value = "テストを受けてください"
Application.EnableEvents = True
End Sub
ワークシート オブジェクトのselectionchange イベントは、VBA に次のことを伝えます。ワークシート内の選択されたセル範囲が変更されると、イベントのイベント プロシージャが自動的に実行されます。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox "現在選択されているセルは:" & Target.Address
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Range("A3:I66").Interior.ColorIndex = xlNone
If Application.Intersect(Target, Range("A3:I66")) Is Nothing Then
Exit Sub
End If
If Target.Count > 1 Then
Set Target = Target.Cells(1)
End If
Dim rng As Range
For Each rng In Range("A3:I66")
If rng.Value = Target.Value Then
rng.Interior.ColorIndex = 6
End If
Next
End Sub
Dim rngvalue As String
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count > 1 Then
Exit Sub
End If
Dim cvalue As String
If Target.Formula = " Then
cvalue = "ヌル"
Else
cvalue = Target.Text
End If
If rngvalue = cvalue Then
Exit Sub
End If
Dim rngcom As Comment
Dim comstr As String
Set rngcom = Target.Comment
If rngcom Is Nothing Then Target.AddComment
comstr = Target.Comment.Text
Target.Comment.Text Text:=comstr & Chr(10) & Format(Now(), "yyyy-mm-ddhh:mm") & _
"オリジナルコンテンツ:" & rngvalue & "着替える:" & cvalue
Target.Comment.Shape.TextFrame.AutoSize = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Cells.Count > 1 Then
Exit Sub
End If
If Target.Formula = " Then
rngvalue = "ヌル"
Else
rngvalue = Target.Text
End If
End Sub
worksheet オブジェクトには合計 17 のイベントがあります。これらのイベントは、[コード ウィンドウ] の [イベント] リスト ボックスまたは VBA ヘルプで確認できます。
共通の worksheet イベント
| イベント名 | 時間の説明 |
|---|---|
| activate | |
| beforeDelete | シートを削除する前に発生します |
| beforeDoubleClick | ワークシートをダブルクリックした後、 |
| beforeRightClick | ワークシートを右クリックする前に、デフォルトのダブルクリック操作が実行されます。 、デフォルトの右クリック 操作の実行前 |
| calculate | ワークシートの再計算後に発生します |
| change | ワークシート内のセルが変更されると発生します |
| deactivate | ワークシートがアクティブから非アクティブに変更されると発生します |
| followHyperlink | ワークシート内のハイパーリンクがクリックされたときに発生します |
| PivotTableUpdate | ワークシート内でピボット テーブルが更新された後に発生します |
| selectionchange | ワークシート内の選択が変更されたときに発生します |
ワークブック イベントは、workbook オブジェクトで発生するイベントです。workbook オブジェクトはワークブックを表します。workbook オブジェクトのイベント プロセスは、ThisWorkbook モジュールに記述する必要があります。 [プロジェクト エクスプローラー] このモジュールを検索
open イベントは、最も一般的に使用される workb@ook イベントの 1 つであり、海外ではこのイベントを使用して Excel の初期化と設定が行われます。たとえば、ワークブックを開く Excel ウィンドウや作業インターフェイスの設定などです。カスタム ユーザーフォームなどを表示します。
private sub workbook_beforeclose(cancel as boolean)
if msgbox("ワークブックを閉じてもよろしいですか?",vbyesno) =vbno then
cancel =true
end if
end sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
MsgBox "あなたが変えているのは、:" & Sh.Name & "ワークシート内で" & Target.Address & "細胞"
End Sub
| イベント名 | イベントの説明 |
|---|---|
| activate | |
| AddinInstall | ワークブックがアドインとしてインストールされたときに発生します |
| AddinUninstall | ワークブックがアドインとしてアンインストールされるときに発生します |
| AfterSave | ワークブックを保存した後に発生しますworkbook |
| BeforeClose | ワークブックを閉じる前に発生します |
| BeforePrint | 印刷時 指定したワークブックの前に発生します |
| beforesave | ワークブックを保存する前に発生します |
| Deavtivate< / td> | ワークブックのステータスが非アクティブのときに発生します |
| NewChart | ワークブックに新しいグラフが作成されたときに発生します |
| Newsheet | ワークブックに新しいワークシートが作成されるときに発生します |
| open | Open work |
| sheetavtivate | シートがアクティブ化されたときに発生します |
| sheetBeforeDoubleClick | ワークシートをダブルクリックする前に発生します |
| sheetBeforeRightClick | ワークシートを右クリックする前に発生します |
| sheetCalculate | シートが再計算された後に発生します |
| SheetChange | シートのセルが変更されたとき 後に発生します |
| sheetDeactivate | シートが非アクティブになったときに発生します |
| sheetFollowHyperLink | シート内のハイパーリンクが非アクティブになったときに発生しますワークブックがクリックされる |
| SheetPivotTableUpdate | ピボット テーブルが更新されると発生します。 |
| sheetSelectionchange | いずれかのシートで選択が変更されたときに発生します |
| WindowActivate | いずれかのワークブック ウィンドウがアクティブになったときに発生します |
| windowdeactivate | ウィンドウが非アクティブになったときに発生します |
| windowresize | ワークブック ウィンドウのサイズを変更したときに発生します |
OnKey メソッドは、キーボード上で指定されたキーまたはキーの組み合わせが押されたときに、指定されたプログラムを自動的に実行するように Excel に指示します。
Sub test()
Application.OnKey "+e", "Hello"
End Sub
Sub Hello()
MsgBox "onkeyメソッドを学んでいます"
End Sub
onkey に設定できるボタンとそれに対応するコード
< /tr >| 使用するキー | 設定するコード |
|---|---|
| Backspace | {backspace} または {BS} |
| Break | {Break} |
| Caps Lock | {CAPSLOCK} |
| Delete or Del | {DELETE} OR {DEL} |
| 下矢印 | {DOWN} |
| End | {END} |
| Enter(テンキー) | {ENTER} |
| ENTER | ~ |
| Esc | {ESCAPE} または {ESC} |
| Home | {HOME} |
| Ins | {INSERT} |
| 左矢印 | {LEFT} |
| Num Lock | {NUMLOCK} |
| PageDown | {PGDN} |
| PageUp | {PGUP} |
| 右矢印 | {RIGHT} |
| Scroll Lock | {SCROLLLOCK} |
| Tab | {TAB} |
| 上矢印 | {UP} |
| F1 ~ F15 | {F1} ~ {F15} |
| Shift | + |
| Crtl | ^ |
| Alt | % |
Ontime メソッドは、指定された時刻に指定されたプロセスを自動的に実行するように VBA に指示します。
Sub test()
Application.OnTime TimeValue("14:07:00"), "Hello"
End Sub
Sub Hello()
MsgBox "ontimeメソッドを学んでいます"
End Sub
Ontime の DateSerial パラメータは、指定した年、月、日を設定できます。Scheduled の値が TRUE の場合、新しい Ontime プロセスが設定されます。 False です。以前に設定されたプロセスをクリアします。デフォルト値は TRUE です。
Sub test()
Application.OnTime Now() + TimeValue("00:05:00"), "AutoSave"
End Sub
Sub AutoSave()
ThisWorkbook.Save
Call test
End Sub
Excel には、フォーム コントロールと ActiveX コントロールの 2 種類のコントロールがあります。 Excel の [リボン] にあります
フォーム コントロール
| コントロール名 | コントロールの説明 |
|---|---|
| ボタン | マクロ コマンドの実行に使用されます |
| コンボ ボックスには複数の選択オプションがあり、ユーザーはいずれかの項目を選択できます | |
| チェックボックス | 選択用のコントロール、複数の選択肢 |
| 数値調整ボタン | 選択コントロールの矢印をクリックして値を選択します |
| リスト ボックス | ユーザーがオプションを選択できる複数のオプションのリストを表示します |
| オプション ボタン | 選択に使用されるコントロール。通常、複数のオプション ボタンがコンボ ボックスと組み合わされており、1 つのコンボ ボックスで同時に選択できるオプション ボタンは 1 つだけです。 group |
| グループ ボックス | 他の複数のコントロールを組み合わせるために使用されます |
| ラベル | 静的テキストの入力と表示に使用されます |
| スクロールバー | 水平スクロールバーと垂直スクロールバーが含まれます |
1. フォーム コントロールを追加する
2. フォーム コントロールを描画する
3. 対応する領域を設定します
1. ActiveX コントロールを追加する
2. プロパティを設定する
制御コードの書き込み
Private Sub xb2_Click()
If xb2.Value = True Then
Range("D2").Value = "女性"
xbl.Value = False
End If
End Sub
Private Sub xbl_Click()
If xbl.Value = True Then
Range("D2").Value = "男"
xb2.Value = False
End If
End Sub
表示コンテンツ
入力関数には 5 つのパラメータがあります:
Sub inbox()
Dim c As Variant
c = InputBox("セルA1に入力したいデータは何ですか?", Title:="ヒント", Default:="jack", xpos:=200, ypos:=250)
Range("A1").Value = c
End Sub
アプリケーション オブジェクトの inputbox メソッドを使用して、プログラム内にインタラクティブなダイアログ ボックスを作成することもできますが、Inputbox 関数と比較すると、Input メソッドのパラメータが若干異なることに注意してください。
application.inputbox(prompt:="コンテンツ",title:= “タイトル”
default := "デフォルト", left := "画面左端からの距離"
top := “画面右端からの距離”, type := "入力データの種類")
type パラメータの設定可能な項目と説明
| 設定可能なパラメータ値 | メソッドの戻り結果の型 |
|---|---|
| 0 | 式 |
| 1 | 数値 |
| 2 | テキスト (文字列 ) |
| 4 | ロジック (true または false) |
| 8 | セル参照(範囲オブジェクト) |
| 16 | エラー値 |
| 64 | 値の配列 |
Sub rngpinput()
Dim rng As Variant
On Error GoTo cancel
Set rng = Application.InputBox("値を入力する必要があるセルを選択してください", Type:=8)
rng.Value = 100
cancel:
End Sub
Sub msg()
MsgBox "あなたが編集しているのは、:" & ThisWorkbook.Name, Buttons:=vbOKOnly + vbInformation, Title:="提示"
End Sub
ダイアログ ボックスに表示されるボタンのスタイルを設定します
< td>[OK]ボタンと[キャンセル]ボタンのみを表示| 定数 | 値 | 説明 |
|---|---|---|
| vbOkonly | 0 | 【OK】ボタンのみ表示 |
| vbOkcancel | 1 | |
| vbAbortRetryIgnore | 2 | [終了]、[再試行]を表示,【無視】3 つのボタン |
| vbYesNoCancel | 3 | はい、いいえ、キャンセルの 3 つのボタンを表示 |
| vbYesNo | 4 | はいボタンといいえボタンを表示 |
| vbRetryCancel | 5 | 再試行表示、2 つのボタンをキャンセル |
さまざまなアイコンのパラメータ設定
< td>[警告クエリ] アイコンを表示| 定数 | 値 | 説明 |
|---|---|---|
| vbCritical | 16 | 【重要な情報】アイコンを表示 |
| vbQuestion | 32 | |
| vbExclamation | 48 | [警告メッセージ] アイコンを表示 |
| vbInformation | 64 | [通知メッセージ]アイコンを表示 |
設定ダイアログのデフォルト ボタン
定数 | 値 | 説明
vbDefaultButton1 | 0 | 最初のボタンはデフォルト値です
vbDefaultButton2 | 2 番目のボタンはデフォルト値
vbDefaultButton3 | 512 | 3 番目のボタンはデフォルト値です
vbDefaultButton4 | 768 | 4 番目のボタンはデフォルト値です
ダイアログの種類を指定します
| 定数 | 値 | 説明 |
|---|---|---|
| vbApplicationModel | 0 | アプリケーションは強制的に復帰します。アプリケーションは、ユーザー メッセージ ボックスが応答するまで続行する前に実行を一時停止します。 |
| vbSystemModel | 4096 | システムは強制的に復帰します。ユーザーがメッセージ ボックスに応答するまで、すべてのアプリケーションは作業を続行する前に一時停止されます。 |
buttons パラメータのその他の設定
| 定数 | 値 | 説明 |
|---|---|---|
| vbMsgBoxHelpButton | 16384 | ダイアログ ボックスにヘルプ ボタンを追加します |
| vbMsgBoxForeground | 65536 | 表示されているダイアログ ウィンドウを最前面ウィンドウとして設定します |
| vbMsgBoxRight | 524288 | ダイアログに表示されるテキストを設定しますas 右揃え |
| vbMsgBoxRtlReading | 1048576 | テキストがヘブライ語および Alibaba システムで右から左に表示されることを指定します Read |
MsgBox 関数の戻り値
< td>vbIgnore| 定数 | 値 | 説明 |
|---|---|---|
| vbOk | 1 | [OK]ボタンをクリックしたとき |
| vbCancel | 2 | [キャンセル]ボタンをクリックした場合 |
| vbAbort | 3 | [中止]ボタンをクリックした場合 |
| vbRetry | 4 | [再試行]ボタンをクリックしたとき |
| 5 | [無視]ボタンをクリックしたとき | |
| vbYes | 6 | [はい]ボタンをクリックした場合 |
| vbNo | 7 | [いいえ]ボタンをクリックした場合クリックされました |
Sub msgbut()
Dim yn As Integer
yn = MsgBox("セル A1 に今日の日付を入力してもよろしいですか?", vbYesNo + vbQuestion)
If yn = vbYes Then
Range("A1").Value = Now()
End If
End Sub
applicationcation オブジェクトの FindFile メソッドを使用すると、[開く] ダイアログ ボックスが表示され、ダイアログ ボックス内のファイルを選択して開くことができます。
Sub openfile()
If Application.FindFile = True Then
MsgBox "the file you chosed has benn open"
Else
MsgBox "[キャンセルボタン]をクリックしたため、操作は完了しません"
End If
End Sub
findfile メソッドとは異なり、GetOpenFileName メソッドを使用すると、ダイアログ ボックスで選択したファイルのファイル名 (パスを含む) を取得し、findfile メソッドを使用すると、ダイアログ ボックスで選択したファイルを開きます。ダイアログ ボックス
任意のファイルを選択してください
Sub getopen()
Dim fil
fil = Application.GetOpenFilename
If fil = False Then
MsgBox "書類がありません"
Exit Sub
Else
Range("E6").Value = fil
End If
End Sub
特定の種類のファイルのみをダイアログに表示します
Sub getopen()
Dim fil
fil = Application.GetOpenFilename(filefilter:="画像ファイル,*.jpg")
If fil = False Then
MsgBox "書類がありません"
Exit Sub
Else
Range("E6").Value = fil
End If
End Sub
ダイアログ ボックスに複数の拡張子を持つファイルを同時に表示させる
Sub getopen()
Dim fil
fil = Application.GetOpenFilename(filefilter:="画像ファイル,*.jpg;*png")
If fil = False Then
MsgBox "書類がありません"
Exit Sub
Else
Range("E6").Value = fil
End If
End Sub
ダイアログ ボックスで複数の種類のファイルを表示するように選択します
Sub getopen()
Dim fil
fil = Application.GetOpenFilename(filefilter:="画像ファイル,*.jpg;*png,Excelワークブックファイル,*xls;*xlsx")
If fil = False Then
MsgBox "書類がありません"
Exit Sub
Else
Range("E6").Value = fil
End If
End Sub
FilterIndex パラメータを使用してデフォルトで表示されるファイル タイプを設定します
[ファイル タイプ] ドロップダウン リストで複数のオプションのファイル タイプが設定されている場合は、GetOpenFileName メソッドの FiterIndex パラメータを使用してデフォルトのファイル タイプを設定できます。ダイアログ ボックスに表示されるファイルの種類
Sub getopen()
Dim fil
fil = Application.GetOpenFilename(filefilter:="画像ファイル,*.jpg;*png, Excel工作簿文件, *xls;*xlsx", FilterIndex:=2)
If fil = False Then
MsgBox "書類がありません"
Exit Sub
Else
Range("E6").Value = fil
End If
End Sub
複数のファイルを同時に選択できる設定です
GetOpenFileNameメソッドで表示される[開く]ダイアログボックスでは、デフォルトでは同時に選択できるファイルは1つだけです。複数のファイルを同時に選択するには、MultiSelect パラメータを TRUE に設定します。
Sub getopen()
Dim fil
fil = Application.GetOpenFilename(filefilter:="画像ファイル,*.jpg;*png, Excelワークブックファイル,*xls;*xlsx", FilterIndex:=2, MultiSelect:=True)
Range("E6").Value = fil
End Sub
ダイアログのタイトルを変更
Sub getopen()
Dim fil
fil = Application.GetOpenFilename(filefilter:="画像ファイル,*.jpg;*png, Excelワークブックファイル,*xls;*xlsx", FilterIndex:=2, MultiSelect:=True, Title:="名前を取得したいファイルを選択してください")
Range("E6").Value = fil
End Sub
選択したファイルの名前を取得するには、アプリケーション オブジェクトの GetSaveAsFilename メソッドを呼び出して [名前を付けて保存] ダイアログ ボックスを開き、ダイアログ ボックスでファイルを選択し、パス情報を含むファイル名を取得することもできます。ファイルの
Sub getsaveas()
Dim fil As String, filename As String, filter As String, tile As String
filename = "例"
filter = "Excelワークブック,*xls;*xlsx,Wordrd ドキュメント,*.doc;*.docx"
Title = "情報を参照するにはファイルを選択してください"
fil = Application.GetSaveAsFilename(InitialFileName:=filename, fileFilter:=filter, Title:=Title, FilterIndex:=2)
Range("A10") = fil
End Sub
取得したいのがファイル名ではなく、指定したディレクトリのパスと名前である場合は、aplication オブジェクトの FileDialog プロパティを使用できます。
Sub getfolder()
With Application.FileDialog(filedialogtype:=msoFileDialogFilePicker)
.InitialFileName = "D:\"
.Title = "ディレクトリを選択してください"
.Show
If .SelectedItems.Count > 0 Then
Range("A1").Value = .SelectedItems(1)
End If
End With
End Sub
msoFileDialogType パラメータは定数に設定できます
| 定数 | 説明 |
|---|---|
| msoFileDialogFilePicker | ファイルの選択を許可する |
| msoFileDialogFolderPicker | フォルダーの選択を許可する |
| msoFileDialogOpen | ファイルを開くことを許可します |
| msoFileDialogSaveAs | ファイルの保存を許可します |
対話型インターフェイスを設計し、コントロールとその機能を定義できればと何度も思いますが、そのためには VBA の別の共通オブジェクト、つまりユーザーフォーム オブジェクトを使用する必要があります。 ユーザー フォームは Userform オブジェクトであり、これはよくフォーム オブジェクトと呼ばれるものです。 フォームをプロジェクトに追加すると、フォームに ActiveX コントロールを自由に追加できます。VBA コードを記述してこれらのコントロールの関数を指定する限り、これらのコントロールを使用して Excel と対話できます。
VBE ウィンドウでフォームを選択し、[実行]—>[サブプロセス/フォームの実行] コマンドを順番に実行すると、選択したフォームが表示されます。
sub showform()
load inputform
inputform.show
end sub
フォームをモーダル フォームとして表示するには、次のコードを使用できます。
InputForm.show
または、show メソッドのパラメータを省略するか、パラメータを vModal に設定すると、VBA はウィンドウをモーダル フォームとして認識します
2. モードレス フォームでは、フォーム外の他の操作が可能になります
フォームをモードレス フォームとして表示するには、show メソッドでパラメータを指定する必要があります
Inputform.show vmodeless
フォームがモードレス フォームとして表示されている場合、フォームが表示されると、システムはプログラムの残りのコードを実行し続け、フォーム外の他のオブジェクトを操作することも可能になります。
unload Inputform
inputform.hide
Initialize イベントはフォームを表示する前に発生します。load ステートメントを使用してプログラムにフォームをロードするか、show を使用してフォームを表示すると、この時間がトリガーされます。
Private Sub UserForm_Initialize()
性別.List = Array("男", "女性")
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
If CloseMode <> vbFormCode Then Cancel = True
End Sub
queryclose イベントプロセスは 2 つのパラメータを持つサブプロセスであり、cancel パラメータはフォームを閉じる操作に応答するかどうかを決定します。 値が TRUE の場合、プログラムはフォームを閉じる操作に応答しません。 cancel の値が false の場合、プログラムはフォームを閉じます。 CloseMode パラメータはフォームを閉じる方法であり、異なる終了メソッドによって返される値は異なります
CloseMode パラメータの戻り値の説明
| 定数 | 値 | 説明 |
|---|---|---|
| vbFormControlMenu | 0 | フォーム内の [閉じる] ボタンをクリックしてフォームを閉じます |
| vbFormCode | 1 | アンロード ステートメントによってフォームを閉じる |
| vbAppWindows | 2 | 現在の Windows 操作環境のプロセスが終了しています |
| vbAppTaskManagee | 3 | Windows [タスク マネージャー] がアプリケーション全体を閉じています |
Private Sub cmd_OK_Click()
Dim xrow As Long
xrow = Range("A1").CurrentRegion.Rows.Count + 1
Cells(xrow, "A").Value = 名前.Value
Cells(xrow, "B").Value = 性別.Value
Cells(xrow, "C").Value = birth.Value
名前.Value = "
性别.Value = "
birth.Value = "
End Sub
ボタンのショートカット キーを設定した後、フォームが表示されたら、対応するショートカット キーを押すと、フォーム内でマウスでボタンをクリックするのと同じになります。
Private Sub UserForm_Initialize()
性别.List = Array("男", "女性")
cmd_OK.Accelerator = "N"
End Sub
オブジェクトがアクティブ化されている場合にのみ、いくつかのキーストロークを入力できます。 コントロールのタブ オーダーにより、ユーザーが [Tab] または [Shift+Tab] キーの組み合わせを押した後にコントロールがアクティブになる順序が決まります。 フォームをデザインするとき、システムはコントロールが追加された順序に従ってコントロールのタブ オーダーを決定します。 ただしこの順序は変更可能です。 VBEでフォームを選択し、[表示]→[タブオーダー]コマンドを順に実行します。 [タブ オーダー] ダイアログ ボックスを表示し、コントロールのタブ オーダーを調整できます。
2. コントロールの関数を指定するコードを追加します
Private Sub cmd_cacel_Click()
Unload ユーザーログイン
ThisWorkbook.Close savechanges:=False
End Sub
Private Sub cmd_ok_Click()
Application.ScreenUpdating = False
Static i As Integer
If CStr(username.Value) = Right(Names("username").RefersTo, Len(Names(username).RefersTo) - 1) And CStr(pwd.Value) = Right(Names("userword").RefersTo, Len(Names("userword").RefersTo) - 1) Then
Unload ユーザーログイン
Else
i = i + 1
If i = 3 Then
MsgBox "ワークブックを開く権限がありません"
ThisWorkbook.Close savechanges:=False
Else
msg "入力ミス,エントリーチャンスは" & (3 - i) & "回あります"
username.Value = "
pwd.Value = "
End If
End If
Application.ScreenUpdating = True
End Sub
Private Sub pwd_set_Click()
Dim old As String, new1 As String, new2 As String
old = InputBox("パスワードを入力してください:", "ヒント")
If old <> Right(Names("userword").RefersTo, Len(Names("userword").referto) - 1) Then
MsgBox "元のパスワードが間違って入力されたため、変更できません", vbCritical, "間違い"
Exit Sub
End If
new1 = InputBox("新しいパスワードを入力してください:", "ヒント")
If new1 = " Then
MsgBox "新しいパスワードを空にすることはできません。変更が完了していません", vbCritical, "間違い"
Exit Sub
End If
new2 = InputBox("新しいパスワードをもう一度入力してください:", "ヒント")
If new1 = new2 Then
Names("userword").RefersTo = "=" & new1
ThisWorkbook.Save
MsgBox "パスワード変更済み"
Else
MsgBox "2 つのパスワード入力が矛盾しており、変更が完了していません", vbCritical, "間違い"
End If
End Sub
Private Sub user_set_Click()
Dim old As String, new1 As String, new2 As String
old = InputBox("ユーザー名を入力してください:", "ヒント")
If old <> Right(Names("username").RefersTo, Len(Names("username").referto) - 1) Then
MsgBox "元のユーザー名が間違って入力されたため、変更できません", vbCritical, "間違い"
Exit Sub
End If
new1 = InputBox("新しいユーザー名を入力してください:", "ヒント")
If new1 = " Then
MsgBox "新しいユーザー名を空にすることはできません。変更が完了していません", vbCritical, "間違い"
Exit Sub
End If
new2 = InputBox("新しいユーザー名をもう一度入力してください:", "ヒント")
If new1 = new2 Then
Names("username").RefersTo = "=" & new1
ThisWorkbook.Save
MsgBox "ユーザー名の変更が完了しました"
Else
MsgBox "2 つのユーザー名に矛盾があり、変更が完了していません", vbCritical, "間違い"
End If
End Sub
On Error GoTo label は、実際には「on error」の後に追加された GoTo ステートメントです。ここで、「label」は goto ステートメントに設定されたラベルであり、数字またはコロンを含むテキストです。 。 タグは、プログラムの実行中にランタイム エラーが発生した場合、タグが配置されている行のコードにジャンプしてプログラムの実行を続行するように VBA に指示します。実際には、プログラムがエラーをスキップできるようにするためです。コードを作成し、別の場所からプログラムを再起動します。
Sub test()
On Error GoTo a
Worksheets("abc").Select
Exit Sub
a: MsgBox "選択するシートがありません"
End Sub
Resume Next は、プログラムでエラーが発生した場合、エラーのあるコードを無視し、エラー行の後のコードを実行するように VBA に指示します。 プログラムの先頭に On Error Resume Next ステートメントが追加されている場合、プログラムの実行時に、プログラムに実行時エラーがあっても、VBA はプログラムを中断せず、エラーのあるすべてのステートメントを無視します。エラーステートメントの後もコードの実行を継続します。
Sub test()
On Error Resume Next
Worksheets("abc").Select
Exit Sub
MsgBox "選択するシートがありません"
End Sub
On Error GoTo 0 ステートメントを使用すると、 プログラム内のランタイム エラーのキャプチャが閉じられます。On Error GoTo 0 ステートメントの後にプログラムにランタイム エラーがある場合、エラーは捕捉されません
Sub test()
On Error GoTo 0
Worksheets("abc").Select
Exit Sub
MsgBox "選択するシートがありません"
End Sub