LoginSignup
1
1

VBA Tips集(思いつけば随時更新)

Last updated at Posted at 2018-08-10

業務でマクロを触ることが多いので、備忘録がてらに書いていきます。
何か思いつけば随時更新していく予定です。

フルアドレスからファイル名を取り出す

fulladdress="C:\work\sample.txt"
splt=split(fulladdress,"\")
msgbox splt(ubound(splt))

ある小数点桁の数字を取得

例えば0.123456789の中の小数点第1位の数字を取得したい場合。
(この例だと「1」を取得したい)

num=0.123456789
'小数点一桁
dec_set=1
result = val(Mid(Abs(num - Fix(num)), dec_set + 2, 1))

これでも取得できるのですが、
エクセルには桁が多くなると親切にも指数表示にしてくれるバグ仕様があります。
その場合はformatを使い、無理やり指数表示を解除した状態で取得します。

num=0.123456789
'小数点一桁
dec_set=1
result = val(Mid(Format(Abs(num - Fix(num)), "0.0000000000000000"), dec_set + 2, 1))

ハイパーリンクのリンク先を取得(同じブックの時)

個人的にちょっとハマったのでメモ。

'Sheet1のA1セルにはSheet2のA1へのリンクがされている
If ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).Hyperlinks.Count > 0 Then
    splt = Split(ThisWorkbook.Worksheets("Sheet1").Cells(1, 1).Hyperlinks.item(1).SubAddress, "!")
    'リンク先のシート名
    sheetname = splt(0)
    'リンク先のセルアドレス
    celladdress=splt(1)
End If

シート内のオートシェイプの個数を取得する

cnt=ActiveSheet.Shapes.Count

シート内のチャートオブジェクトの個数を取得

cnt=ActiveSheet.ChartObjects.Count

チャートオブジェクトを画像として保存する

このマクロを実行しているディレクトリに保存します。

ActiveSheet.ChartObjects(1).Chart.Export ThisWorkbook.Path & "/test.png"

シート内にあるチャートオブジェクトをグラフタイトルの名前で全て画像化

ちょっと応用。

For i = 1 To ActiveSheet.ChartObjects.Count
    title = ActiveSheet.ChartObjects(i).Chart.ChartTitle.Text
    ActiveSheet.ChartObjects(i).Chart.Export ThisWorkbook.Path & title & ".png"
Next i

最終行、最終列の取得

こちらのサイトをご参考に。

MaxRow = Worksheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
MaxCol = Worksheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column

ファイルを開く

Workbook型の変数を用意し、Setを使ってWorkbooks.Openすることで、
下記の場合xlsfile.Worksheets(1).cells(1,1).Valueのような書き方ができる。

Dim xlsfile As Workbook
url="C:\work\test.xlsx"
Set xlsfile = Workbooks.Open(Filename:=url)

テキストファイルを開いて1行ずつ読み込む

f = FreeFile

file = "text.txt"

If Dir(file) = "" Then
    MsgBox file & "が見つかりません"
    Exit Sub
Else
    Open file For Input As #f
End If

Do Until EOF(f)
    Line Input #f, file_line
    MsgBox file_line
Loop

Close #f

指定フォルダ内にあるファイルを開いて処理する

今回はマクロのあるExcelファイルと同じ場所に「data」というフォルダがあり、その中にファイルが入っていると想定します。

Sub main()
    Dim wb As Workbook
    
    Dim path
    path = "./data/"
    
    Dim buf
    buf = Dir(path & "*")
    
    Do While buf <> ""
        Debug.Print buf
        Set wb = Workbooks.Open(Filename:=path & buf)
        wb.Close
        Set wb = Nothing
        buf = Dir()
    Loop
End Sub

自シートCell全削除

cells.clear

マクロ高速化対策

'画面の更新を停止
Application.ScreenUpdating = False
'再計算を停止
Application.Calculation = xlCalculationManual

~~~ここに処理~~~

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

DB接続

インストールが必要だったりするものがあるが面倒なので割愛

Const DB_HOST As String = "HOST"
Const DB_NAME As String = "NAME"
Const DB_USER As String = "USER"
Const DB_PASS As String = "PASS"
Const DB_PORT As String = "5432"

Dim cnn As Object
Dim rs As Object
Set cnn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

cnn.Open "Provider=MSDASQL;Driver=PostgreSQL Unicode;UID=postgres;port=" & DB_PORT & ";Server=" & DB_HOST & ";Database=" & DB_NAME & ";PWD=" & DB_PASS & ";"

Dim sql
sql = "ここにSQLを記述"

rs.Open sql, cnn, adOpenForwardOnly, adLockReadOnly

'列数を取得
Dim cnt
cnt = rs.Fields.Count
Dim i
'取得したデータを1行ずつ追記していく
Do Until rs.EOF
    For i = 0 To cnt - 1
        Cells(rcnt, i + 1).Value = RTrim(rs.Fields(i))
    Next i
    rs.MoveNext
Loop
rs.Close

Set rs = Nothing
Set cnn = Nothing

連想配列を使って重複しないキーを取得する(Dictionary)

Dim i
Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")
For i = 2 To Cells(Rows.Count, 1).End(xlUp).row
    If dict.exists(Cells(i, 1).Value) = False Then
        dict.Add Cells(i, 1).Value, ""
    End If
Next i
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1