[VBA,VB.NET,C#,PHP]プログラムTips集

[VBA,VB.NET,C#,PHP]プログラムのちょっとしたテクニック

使用されているセル範囲を全て取得する方法

UsedRangeとAddressを組み合わせることで、使用中のセル全てを取得することも可能です。

    '使用されているセルアドレスを取得
    Dim sAddress As String
    sAddress = UsedRange.Address
    'Rangeとして取得する
    Dim rng As Range
    Set rng = Me.Range(sAddress)
    '最終行
    '★開始行に行数を足すと1セル下の値が返されるので-1しておくこと★
    Debug.Print (rng.Row + rng.Rows.Count - 1)

エクセルVBAで最終行を見つける方法

Excel VBA マクロの最終行を取得

Range.End メソッドで最終行を取得可能

定数名 説明
xlUp -4162 上端
xlDown -4121 下端
xlToLeft -4159 左端
xlToRight -4161 右端
End.EntireRow   指定すると終端の行を取得できます。
Dim r As Range
‘セル「A1」の下端の行を取得
Set r = Range("A1").End(xlDown).EntireRow
r.Select

途中の行に空白セルがある場合は上記の方法で最終行取得ができません。

この場合、空白セルの上のセルが最終行と判定されます。

こういうときはシートの最終行から上端のセルを取得します。

‘エクセルにおける最終行を取得(空白も含めて)
Dim intLast As Integer
intLast  = Rows.Count
‘取得したい列番号を設定(A列⇒1,B列⇒2,C列⇒3,・・・E列⇒5・・・)
Dim intCol As Integer
intCol  = 5
‘最終行を探す(値が入っているセル)
Dim r As Range
Set r = Cells(intLast , intCol ).End(xlUp) 
r.Select

UsedRange で取得した範囲から最終行を取得

Dim r As Range
'使用している範囲を取得
Set r = ActiveSheet.UsedRange 

フォルダ内の全ファイルを取得する方法(サブフォルダも含めて取得)

' フルパスを格納するリスト
Public lstFullPath As Collection

' 呼出し:ルートパスを指定
Public Sub GetAllFilePath()
    ' 初期化
    Set lstFullPath = New Collection
    ' ルートパスを指定(最後の\マークは不要)
    Call GetSubDir("c:\root\src")
End Sub

' サブフォルダを含めてファイルのフルパスを全取得
Sub GetSubDir(Path As String)
    Dim buf As String, f As Object
    buf = Dir(Path & "\*.*")
    Do While buf <> ""
	' フルパスを格納
	Dim sCurFullPath As String
            sCurFullPath = Path & "\" & buf
            lstFullPath.Add(sCurFullPath )
            ‘次ファイルを検索
            buf = Dir()
    Loop
    ‘ サブフォルダへ移動
    With CreateObject("Scripting.FileSystemObject")
        For Each f In .GetFolder(Path).SubFolders
            Call GetSubDir(f.Path)
            DoEvents
        Next f
    End With
End Sub

任意フォルダ内の全てのエクセルに対して同じ処理をしたい場合

' ========================================================
'@ 機能:全てのブック、シートに対して同じ処理をしたい場合
'@ 日付:2014.01.20
'@ 作成:D.O Revolutions エンターテイメントカレッジ
' ========================================================
Sub ExeOperationTemplate()
    On Error GoTo ERR001
    '-----------------------------------------------------
    '変数宣言
    '-----------------------------------------------------
    Dim wsSheet As Worksheet
    Dim wbCurrent As Workbook
    Dim DIR_PATH As String
    Dim fl_name As String
    '-----------------------------------------------------
    '固定値
    '-----------------------------------------------------
    Const S_TARGET_SHEET = "10桁を6桁変換"
    Const S_PATH_CELL = "C6"
    '-----------------------------------------------------
    'エクセルの保存パスを取得
    '-----------------------------------------------------
    ThisWorkbook.Activate
    ThisWorkbook.Worksheets(S_TARGET_SHEET).Activate
    DIR_PATH = ThisWorkbook.ActiveSheet.Range(S_PATH_CELL).Value
    '-----------------------------------------------------
    'アラート非表示
    '-----------------------------------------------------
    Application.DisplayAlerts = False
    '-----------------------------------------------------
    'エクセルファイルを検索
    '(無ければエラーメッセージ)
    '-----------------------------------------------------
    fl_name = Dir(DIR_PATH & "\*.xls*")
    If fl_name = "" Then
        MsgBox "Excelファイルがありません。"
        Exit Sub
    End If
    '-----------------------------------------------------
    'フォルダの全エクセルファイルを取得ループ
    '-----------------------------------------------------
    Do
        ' 現在のワークブックを取得
        Set wbCurrent = Workbooks.Open(Filename:=DIR_PATH & "\" & fl_name, UpdateLinks:=False)
        '-----------------------------------------------------
        '現在ワークブックの全シートを取得ループ
        '-----------------------------------------------------
        For Each wsSheet In wbCurrent.Worksheets
            ' カレントシートをアクティブ化
            wsSheet.Activate
            Debug.Print wsSheet.Name & "の処理中・・・"
            '★=================================================
            '★実行処理はここに記述
            '★=================================================
            '★例)シートの{A1}セルに"ABC"と入力したい場合★
            'wsSheet.Range("A1").Value = "ABC"
            '★=================================================
            ' 各シートの先頭セルを選択状態にする
            wsSheet.Range("A1").Select
        Next
        ' 各ブックの先頭シートを選択
        wbCurrent.Worksheets(1).Activate
        '保存して閉じる
        wbCurrent.Save
        wbCurrent.Close (True)
        '-----------------------------------------------------
        '次のエクセルを探す
        '(無ければ処理終了)
        '-----------------------------------------------------
        fl_name = Dir
    Loop Until fl_name = ""
    ' 正常終了時
    '-----------------------------------------------------
    'アラート表示
    '-----------------------------------------------------
    Application.DisplayAlerts = True
    MsgBox "正常終了"
    Exit Sub
ERR001:
    ' 異常発生時
    MsgBox "エラー番号:" & Err.Number & vbCrLf & "エラーソース:" & Err.Source & vbCrLf & _
           "エラーの種類:" & Err.Description, vbExclamation
    '-----------------------------------------------------
    'アラート表示
    '-----------------------------------------------------
    Application.DisplayAlerts = True
End Sub

エクセルのVBAマクロでセルをFind検索する際に下から上に逆方向で見つける方法

エクセルVBAの参照設定を動的に変更する方法

‘ 参照設定追加
Sub AddReferences()
On Error Resume Next
    Dim Ref
    With ActiveWorkbook.VBProject
                Call .References.AddFromFile("C:\work\common1.xlam")
                Call .References.AddFromFile("C:\work\common2.xlam")
    End With
End Sub

‘ 参照設定削除
Sub RemoveReferences()
On Error Resume Next
    Dim Ref
    With ActiveWorkbook.VBProject
        For Each Ref In ActiveWorkbook.VBProject.References
	‘ common1.xlamを参照していたら削除(チェックを外す)
            If ((InStr(Ref.FullPath, "common1.xlam") > 0 )) Then
                Call .References.Remove(Ref)
                GoTo C_FOR
            End If
	‘ common2.xlamを参照していたら削除(チェックを外す)
            If ((InStr(Ref.FullPath, "common2.xlam") > 0 )) Then
                Call .References.Remove(Ref)
                GoTo C_FOR
            End If
C_FOR:
        Next Ref
    End With
End Sub

Access(テーブル、クエリ)をCSVファイルとして出力する方法

VBACSVファイルを作成して出力する方法

Sub Exp_CSV()
Dim dbs As DAO.Database
Dim rst As Dim rst As DAO.Recordset
Dim lngFileNum As Long
Dim strOutPut As String
lngFileNum = FreeFile()
Open "C:\work\expdata.csv" For Output As #lngFileNum
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("M_DATA")
With rst
strOutPut = ""
Do Until .EOF
strOutPut = strOutPut & !コード & "," & !品名 & "," & _
!備考 & "," & !数量 & "," & !仕入先 & vbCrLf
.MoveNext
Loop
.Close
End With
Print #lngFileNum, strOutPut
Close #lngFileNum
End Sub