- 動作環境
- デバッグ中に変数の内容を参照したい
- ファイルを複写したい
- Excel2003 ファイルを開いた時、そのファイルのあるフォルダを取得したい
- Access2003 から既存の Excel2003 のファイルを操作したい
- テーブルの内容を参照したい
- Variantに格納されている値が何型か判断したい
- Object変数に格納されている値が何型か判断したい
- シートの中の値を検索したい
- 値をクリア
- 数式かどうか判定したい
- グループ化されているオートシェイプの名称
- テキストボックス(オートシェイプ)に値を設定
- ワークブックに含まれるチャートのデータ範囲を取得
- ワークブックを保存しないで閉じる
- あるセルがセル範囲に含まれるかどうか
- Windows XP Professional Edition SP3
- Microsoft Office 2003
デバッグ中に変数の内容を参照するには変数名にカーソルをあわせます。
また、イミディエイトウィンドウで「?変数名」と入力しEnterキーを押下します。
(abcという変数なら?abc)<また、ソースコード中に以下のようなソースを入力することでイミディエイトウィンドウに出力することができます。
以下サンプルではabcという変数の内容をイミディエイトウィンドウに出力しています。
Debug.Print abc
以下のサンプルでは「C:\複写元.txt」を「C:\複写先.txt」という名称で複写しています。
Public Sub ファイルの複写()
FileCopy "C:\複写元.txt", "C:\複写先.txt"
End Sub
以下のサンプルでは開いたAccessのファイルが存在するフォルダ名を取得しています。
Public Function getCurrentFolder() As String
Dim sPath As String
Dim i As Integer
sPath = CurrentDb.Name
For i = Len(sPath) To 1 Step -1
If Mid(sPath, i, 1) = "\" Then
getCurrentFolder = Left(sPath, i - 1)
Exit For
End If
Next i
End Function
以下のサンプルでは開いたAccessのファイルと同一フォルダにある「vba.xls」というファイルの1番目のシートのB2セルの値を読み込んでいます。(上記のFunctionを使用しています。)
Public Sub 既存のエクセルファイルを読む()
MsgBox readExcelCell("\" & "vba.xls", 1, 2, 2)
End Sub
Public Function readExcelCell( _
ByVal sBookPath As String _
, ByVal iSheetNo As Integer _
, ByVal iRowNo As Integer _
, ByVal iCellNo As Integer _
) As Variant
On Error GoTo catch_
Dim oApp As Object
Dim sPath As String
Dim i As Integer
Set oApp = CreateObject("Excel.Application")
sPath = sBookPath
If Left(sBookPath, 1) = "\" Then
sPath = getCurrentFolder() & sBookPath
End If
oApp.Workbooks.Open Filename:=sPath
readExcelCell = oApp.ActiveWorkbook _
.Worksheets(iSheetNo).Cells(iRowNo, iCellNo)
GoTo finally_
catch_:
MsgBox "実行時エラー:" & Err.Number & " " _
& Err.Description, vbExclamation
Resume finally_
finally_:
If Not (oApp Is Nothing) Then
oApp.Quit
Set oApp = Nothing
End If
End Function
Access内に以下のようなテーブルが存在したとします。このテーブルの内容を参照します。
id | name | address |
---|---|---|
1 | 太郎 | 東京都 |
2 | 花子 | 埼玉県 |
3 | ゴン太 | 神奈川県 |
Public Sub テーブルの内容を参照したい()
On Error GoTo catch_
Dim oDB As DAO.Database: Set oDB = Nothing
Dim oRS As DAO.Recordset: Set oRS = Nothing
Set oDB = CurrentDb()
Set oRS = oDB.OpenRecordset("person")
Do Until oRS.EOF
Debug.Print oRS!id
Debug.Print oRS!name
Debug.Print oRS!address
oRS.MoveNext
Loop
GoTo finally_
catch_:
MsgBox "実行時エラー:" & Err.Number & " " _
& Err.Description, vbExclamation
Resume finally_
finally_:
If Not (oRS Is Nothing) Then
oRS.Close: Set oRS = Nothing
End If
If Not (oDB Is Nothing) Then
oDB.Close: Set oDB = Nothing
End If
End Sub
「Set oDB」としている行があります。他のAccessファイルを開くとき、ExcelからAccessファイルを開くときには以下のコードを利用します。
以下のサンプルでは「C:\vba.mdb」というファイルを開いています。
注・Excelから利用の際は [ツール] -> [参照設定] で 「Microsoft DAO X.X Object Library」を参照可能にして下さい。
検索条件を指定したい場合はレコードセットのfilterを使用します。以下のサンプルでは「name」が「太郎」のレコードを指定しています。
そもそもSQLで指定したい場合は以下のように行います。
Variant型の変数には実際に何型の変数が格納されているのでしょうか。
値 | 定数 | 内容 |
---|---|---|
0 | vbEmpty | Empty値 |
1 | vbNull | Null値 |
2 | vbInteger | 整数型 |
3 | vbLong | 長整数型 |
4 | vbSingle | 単精度浮動小数点数型 |
5 | vbDouble | 倍精度浮動小数点数型 |
6 | vbCurrency | 通貨型 |
7 | vbDate | 日付型 |
8 | vbString | 文字列型 |
9 | vbObject | オブジェクト |
10 | vbError | エラー値 |
11 | vbBoolean | ブール型 |
8192 | vbArray | 配列 |
整数型の配列が格納されているなら8194(=2+8192)が返るということになります。ユーザ定義型はVariant型に設定できません。
Object変数には実際に何型の変数が格納されているのでしょうか。
TypeName(調べたい変数名)
特定の値を検索するにはFindが便利です。
Set outputBook = ???
Set obj = outputBook.Worksheets(idxSheet).Cells.Find(placeHolder)
Do While Not obj Is Nothing
実際の処理を記述
Set obj = outputBook.Worksheets(idxSheet).Cells.FindNext(obj) ' 次を検索
Loop
通常のセルや結合セルによってクリア方法が異なります。
If XXX.MergeCells Then
XXX.MergeArea.ClearContents ' 結合セルの場合
Else
XXX.ClearContents ' 通常セルの場合
End If
特定のセルが数式かどうか判定できます。
If XXX.HasFormula Then
数式の時の処理
End If
グループ化されているテキストボックスの名称を取得します。
For Each shp In ActiveSheet.Shapes
If shp.Type = msoGroup Then
For i = 1 To shp.GroupItems.Count
With shp.GroupItems(i)
If .Type = msoTextBox Then
Debug.Print .name
End If
End With
Next
End If
Next
ActiveSheet.Shapes("テキスト ボックス 1").TextFrame.Characters.Text = "aaa"
Dim c As Chart
Dim ws As Worksheet
Dim s As Series
For Each ws In ThisWorkbook.Worksheets
Debug.Print vbCr
Debug.Print ws.Name
For Each co In ws.ChartObjects
Set c = co.Chart
For Each s In c.SeriesCollection
Debug.Print s.Formula
Next
Next
Next
ThisWorkbook.Close SaveChanges:=False
Application.Intersect(Range("B6:D6"), Range("C3:C9")).Address
Application.Intersect(Range("C6"), Range("C3:C9")).Address
含まれない場合はNothingが返却されます。