ラベル Excel の投稿を表示しています。 すべての投稿を表示
ラベル Excel の投稿を表示しています。 すべての投稿を表示

2017年8月5日

【Excel】INIファイルを読み書きするマクロをクラスにする


前回、INIファイルを読み書きするマクロを書きましたが、こういう処理というのはクラスにしてしまったほうがあとあと使い勝手がよくなります。

まずは、Visual Basic Editorのメニューの[挿入]から[クラス モジュール]を選択してください。
すると「Class1」という名前のクラスモジュールで作成されると思いますので、プロパティウィンドウでオブジェクト名を変更してください。

ここでは、「IniFileClass」という名前にしました。

ではコードです。

IniFileClass

'Win32API宣言
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long

Private mFileName As String     'Iniファイル名
Private mSection As String      'セクション名

'// プロパティ
Public Property Let FileName(ByVal value As String)
    mFileName = value
End Property

Public Property Let Section(ByVal value As String)
    mSection = value
End Property

'クラスの初期化処理
Private Sub Class_Initialize()

    mFileName = ""
    mSection = ""
    
End Sub

'Iniファイルから指定したキーの値を取得
Public Function GetValue(ByVal key As String) As String

    Dim value As String * 255
    
    Call GetPrivateProfileString(mSection, key, "ERROR", value, Len(value), mFileName)
    
    GetValue = Left(value, InStr(1, value, vbNullChar) - 1)

End Function

'Iniファイルの指定したキーに値を書き込む
Public Function SetValue(ByVal key As String, ByVal value As String) As Boolean

    Dim rtn As Long

    rtn = WritePrivateProfileString(mSection, key, value, mFileName)
    
    SetValue = CBool(rtn)

End Function


クラスの使い方


では、作成したクラスを使って、Iniファイルの読み書きを行ってみます。
コードは、前回と同じ処理をクラスを使った方法に書き換えています。

読み込み
Sub GetValue()

    Dim inc As New IniFileClass
    Dim r As Integer
    Dim g As Integer
    Dim b As Integer
    
    inc.Section = "CellColor"
    inc.FileName = "C:\work\Excel\conf.ini"
    
    'R
    r = CInt(inc.GetValue("R"))
    
    'G
    g = CInt(inc.GetValue("G"))
    
    'B
    b = CInt(inc.GetValue("B"))
    
    Range("B2").Interior.Color = RGB(r, g, b)

End Sub

まず、Newでクラスのインスタンスを作成します。
次に、SectionプロパティとFileNameプロパティに値を設定します。
そして、最後にGetValueメソッドを使い値を読んでいます。


書き込み
Sub SetValue()

    Dim inc As New IniFileClass
    Dim rtn As Boolean
    inc.Section = "CellColor"
    inc.FileName = "C:\work\Excel\conf.ini"
    
    rtn = inc.SetValue("R", "255")
    rtn = inc.SetValue("G", "20")
    rtn = inc.SetValue("B", "147")
    
End Sub

書き込む場合は同じで、最初にインスタンスを作成してプロパティに値を設定したら、SetValueメソッドで書き込むだけです。


このクラスを使った方法のほうがコードがすっきりしていて見やすいと思います。また、IniファイルのKeyを何個も読み書きするような場合にもクラスを使ったほうが効率がいいと思います。


2017年8月4日

【Excel】INIファイルを読み書きするマクロ


INIファイルを扱うにはWin32APIを使います。

まずは、下記のコードをどこかに記述しておいてください。
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long


読み込み



たとえば、このようなINIファイルのデータを読み込むには次のように記述します。

Sub GetValue()

    Dim Value As String * 255
    Dim section As String
    Dim fileName As String
    Dim r As Integer
    Dim g As Integer
    Dim b As Integer
    
    section = "CellColor"
    fileName = "C:\work\Excel\conf.ini"
    
    'R
    Call GetPrivateProfileString(section, "R", "ERROR", Value, Len(Value), fileName)
    r = Left(Value, InStr(1, Value, vbNullChar) - 1)
    
    'G
    Call GetPrivateProfileString(section, "G", "ERROR", Value, Len(Value), fileName)
    g = Left(Value, InStr(1, Value, vbNullChar) - 1)
    
    'B
    Call GetPrivateProfileString(section, "B", "ERROR", Value, Len(Value), fileName)
    b = Left(Value, InStr(1, Value, vbNullChar) - 1)
    
    Range("B2").Interior.Color = RGB(r, g, b)
    
End Sub
この例ではセルの背景色の値を取得して、実際にセルB2の背景色を変更しています。
また、取得した値には後ろにNull文字が含まれていますので、Left関数で取り除いています。

実行結果




書き込み

INIファイルに書き込む例です。
Sub SetValue()

    Dim section As String
    Dim fileName As String
    
    section = "CellColor"
    fileName = "C:\work\Excel\conf.ini"

    Call WritePrivateProfileString(section, "R", "255", fileName)
    Call WritePrivateProfileString(section, "G", "20", fileName)
    Call WritePrivateProfileString(section, "B", "147", fileName)

End Sub

実行結果



2017年8月3日

【Excel】CSVファイルからデータを取得してシートに表示するマクロ


CSVファイルからデータを取得してシートに表示するマクロです。

まず、CSVファイルにこのようなデータが格納されていたとします。
ID,EmployeeNumber,FirstName,LastName
1,10001,久江,丸山
2,10002,正義,梅田
3,10003,智子,篠原
4,10004,貞行,角田
5,10005,俊郎,松井
6,10006,健三,米田
7,10007,リサ,小田
ファイル名:T_Users.csv

このデータを次のシートに格納してみます。

1行目には列名をあらかじめ入力しています。

では、実際のコードは次のようになります。
Sub GetCsvData()

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rst As ADODB.Recordset
    Dim i As Integer
    
    cnn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=C:\work\Excel;ReadOnly=0"
    
    Set cmd = New ADODB.Command
    
    With cmd
        .ActiveConnection = cnn
        .CommandText = "SELECT ID, EmployeeNumber, FirstName, LastName FROM T_Users.csv"
        .CommandType = adCmdText
    End With
    
    'SQLを実行
    Set rst = cmd.Execute
    
    i = 2
    
    While rst.EOF = False
        'セルにデータを格納
        Cells(i, 1).Value = rst!ID
        Cells(i, 2).Value = rst!EmployeeNumber
        Cells(i, 3).Value = rst!FirstName
        Cells(i, 4).Value = rst!LastName
    
        'レコードを移動
        rst.MoveNext
        i = i + 1
    Wend
        
    rst.Close
    Set rst = Nothing
    Set cmd = Nothing
    cnn.Close
    Set cnn = Nothing
    
End Sub
SELECT文のFROMでCSVファイル名を指定します。また、CSVファイルの1行目は項目名とみなされます。

実行結果



2017年8月2日

【Excel】Accessのaccdbからデータを取得してシートに表示するマクロ



Accessのaccdbからデータを取得してシートに表示するマクロです。

まず、Accessでこのようなデータが格納されていたとします。

テーブル名:T_Users

このデータを次のシートに格納してみます。

1行目には列名をあらかじめ入力しています。

では、実際のコードは次のようになります。
Sub GetMdbData()

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rst As ADODB.Recordset
    Dim i As Integer
    
    cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\work\access\test.accdb"
    
    Set cmd = New ADODB.Command
    
    With cmd
        .ActiveConnection = cnn
        .CommandText = "SELECT ID, ユーザーID, 名前, 備考 FROM T_Users"
        .CommandType = adCmdText
    End With
    
    'SQLを実行
    Set rst = cmd.Execute
    
    i = 2
    
    While rst.EOF = False
        'セルにデータを格納
        Cells(i, 1).Value = rst!ID
        Cells(i, 2).Value = rst!ユーザーID
        Cells(i, 3).Value = rst!名前
        Cells(i, 4).Value = rst!備考
    
        'レコードを移動
        rst.MoveNext
        i = i + 1
    Wend
    
    rst.Close
    Set rst = Nothing
    Set cmd = Nothing
    cnn.Close
    Set cnn = Nothing
    
End Sub

実行結果



2017年8月1日

2017年7月31日

【Excel】SQL Serverからデータを取得してシートに表示するマクロ


SQL Serverからデータを取得してシートに表示するマクロです。

まず、SQL Serverでこのようなデータが格納されていたとします。

テーブル名:T_Users

このデータを次のシートに格納してみます。

1行目には列名をあらかじめ入力しています。

では、実際のコードは次のようになります。
Sub GetSQLData()

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rst As ADODB.Recordset
    Dim i As Integer
    
    cnn.Open "Driver={SQL Server}; Server=xxxxxx; Database=xxxxxx; UID=xxxxx; PWD=xxxxx;"
    
    Set cmd = New ADODB.Command
    
    With cmd
        .ActiveConnection = cnn
        .CommandText = "SELECT ID, EmployeeNumber, FirstName, LastName FROM T_Users"
        .CommandType = adCmdText
    End With
    
    'SQLを実行
    Set rst = cmd.Execute
    
    i = 2
    
    While rst.EOF = False
        'セルにデータを格納
        Cells(i, 1).Value = rst!ID
        Cells(i, 2).Value = rst!EmployeeNumber
        Cells(i, 3).Value = rst!FirstName
        Cells(i, 4).Value = rst!LastName
    
        'レコードを移動
        rst.MoveNext
        i = i + 1
    Wend
    
    rst.Close
    Set rst = Nothing
    Set cmd = Nothing
    cnn.Close
    Set cnn = Nothing
    
End Sub

実行結果



2017年7月28日

【Excel】ユーザーからの入力を受け付けるダイアログボックスを表示するマクロ


InputBox関数を使うことで、ユーザーからの入力を受け付けるダイアログボックスを表示することが出来ます。

Sub ShowInputBox()

    Dim usr As String
    
    usr = InputBox("名前を入力してください。", "InputBox Title")
    
    If usr <> "" Then
        
        MsgBox "こんにちは、" & usr & "さん。"
    
    End If
    
End Sub
ユーザーが[キャンセル]ボタンをクリックすると長さ0の文字列("")が返されます。


実行結果

InputBoxが表示されたら、


文字を入力して[OK]をクリック。




<参考サイト>
InputBox 関数 | Office VBA 言語リファレンス


2017年7月27日

【Excel】数値をパーセント書式設定するマクロ


FormatPercent関数で数値をパーセント書式設定することができます。

Sub GetFormatPercent()

    MsgBox FormatPercent(0.12)
    
End Sub
第2引数以下の引数を省略すると、省略した引数の設定にはシステムの地域の設定が使用されます。

実行結果



表示する小数点以下の桁数を指定

第2引数に少数の桁数を指定できます。数値は四捨五入されるようです。
Sub GetFormatPercent()

    MsgBox FormatPercent(2 / 3, 2)
    
End Sub

実行結果



小数値に先行ゼロを表示するかどうかの指定

第3引数で小数値に先行ゼロを表示させるかどうかを指定できます。
Sub GetFormatPercent()

    MsgBox FormatPercent(0.005, 1, vbTrue)
    
End Sub
Trueを指定した場合。

実行結果


Sub GetFormatPercent()

    MsgBox FormatPercent(0.005, 1, vbFalse)
    
End Sub
Falseを指定した場合。

実行結果



負の値をカッコで囲むかどうかの指定

第4引数で負の値をカッコで囲むかの指定ができます。
Sub GetFormatPercent()

    MsgBox FormatPercent(-0.1, 0, vbTrue, vbTrue)

End Sub
Trueを指定。

実行結果

カッコで囲まれた形で表示されます。


区切り記号の表示

第5引数で桁の区切り記号を表示させるかどうかの指定が出来ます。
Sub GetFormatPercent()

    MsgBox FormatPercent(10, -1, vbTrue, vbTrue, vbFalse)

End Sub
Falseを指定。

実行結果

カンマが無い状態で表示されます。


<参考サイト>
FormatPercent 関数 | Office VBA 言語リファレンス


2017年7月26日

【Excel】数値を書式設定するマクロ


FormatNumber関数で数値を書式設定することができます。

Sub GetFormatNumber()

    MsgBox FormatNumber(1200)
    
End Sub
第2引数以下の引数を省略すると、省略した引数の設定にはシステムの地域の設定が使用されます。

実行結果



表示する小数点以下の桁数を指定

第2引数に少数の桁数を指定できます。数値は四捨五入されるようです。
Sub GetFormatNumber()

    MsgBox FormatNumber(200 / 3, 2)
    
End Sub

実行結果



小数値に先行ゼロを表示するかどうかの指定

第3引数で小数値に先行ゼロ(1以下の数値の場合の先頭の0という意味?)を表示させるかどうかを指定できます。
Sub GetFormatNumber()

    MsgBox FormatNumber(0.056, 3, vbTrue)
    
End Sub
Trueを指定した場合。

実行結果



Sub GetFormatNumber()

    MsgBox FormatNumber(0.056, 3, vbFalse)
    
End Sub
Falseを指定した場合。

実行結果



負の値をカッコで囲むかどうかの指定

第4引数で負の値をカッコで囲むかの指定ができます。
Sub GetFormatNumber()

    MsgBox FormatNumber(-100, 0, vbTrue, vbTrue)
    
End Sub
Trueを指定。

実行結果

カッコで囲まれた形で表示されます。


区切り記号の表示

第5引数で桁の区切り記号を表示させるかどうかの指定が出来ます。
Sub GetFormatNumber()

    MsgBox FormatNumber(1234567, 0, vbTrue, vbTrue, vbFalse)
    
End Sub
Falseを指定。

実行結果

カンマが無い状態で表示されます。



<参考サイト>
FormatNumber 関数 | Office VBA 言語リファレンス


2017年7月25日

【Excel】数値を通貨形式の書式で表示するマクロ


FormatCurrency関数で数値を通貨形式の書式で表示できます。

Sub GetFormatCurrency()

    MsgBox FormatCurrency(1200)
        
End Sub
通貨記号や位置は、システムの地域の設定によって決まります。
第2引数以下の引数を省略すると、省略した引数の設定にはシステムの地域の設定が使用されます。

実行結果



表示する小数点以下の桁数を指定

第2引数に少数の桁数を指定できます。数値は四捨五入されるようです。
Sub GetFormatCurrency()

    MsgBox FormatCurrency(200 / 3, 2)

End Sub

実行結果



小数値に先行ゼロを表示するかどうかの指定

第3引数で小数値に先行ゼロ(1以下の数値の場合の先頭の0という意味?)を表示させるかどうかを指定できます。
Sub GetFormatCurrency()

    MsgBox FormatCurrency(0.056, 3, vbTrue)

End Sub
Trueを指定した場合。

実行結果


Sub GetFormatCurrency()

    MsgBox FormatCurrency(0.056, 3, vbFalse)

End Sub
Falseを指定した場合。

実行結果



負の値をカッコで囲むかどうかの指定

第4引数で負の値をカッコで囲むかの指定ができます。
Sub GetFormatCurrency()

    MsgBox FormatCurrency(-100, -1, vbTrue, vbTrue)

End Sub
Trueを指定。

実行結果

カッコで囲まれた形で表示されます。


区切り記号の表示

第5引数で桁の区切り記号を表示させるかどうかの指定が出来ます。
Sub GetFormatCurrency()

    MsgBox FormatCurrency(1234567, -1, vbTrue, vbTrue, vbFalse)

End Sub
Falseを指定。

実行結果

カンマが無い状態で表示されます。



<参考サイト>
FormatCurrency 関数 | Office VBA 言語リファレンス

2017年7月24日

【Excel】日付や時刻を決まった書式で表示するマクロ


日付や時刻を決まった書式で表示するマクロです。

Sub GetFormatDateTime()

    MsgBox "vbGeneralDate   " & FormatDateTime(Now, vbGeneralDate) & vbCrLf & _
           "vbLongDate       " & FormatDateTime(Now, vbLongDate) & vbCrLf & _
           "vbShortDate      " & FormatDateTime(Now, vbShortDate) & vbCrLf & _
           "vbLongTime      " & FormatDateTime(Now, vbLongTime) & vbCrLf & _
           "vbShortTime      " & FormatDateTime(Now, vbShortTime) & vbCrLf
End Sub

実行結果



第2引数の設定値
定数概要
vbGeneralDate0日付と時刻の一方または両方
vbLongDate1長い日付形式
vbShortDate2短い日付形式
vbLongTime3長い時刻形式
vbShortTime4短い時刻形式


<参考サイト>
FormatDateTime 関数 | Office VBA 言語リファレンス

2017年7月22日

【Excel】文字列から日付や時刻値を取得するマクロ


文字列から日付や時刻値を取得するマクロです。

DateValue

文字列から日付値を取得するには、DateValue関数を使います。
Sub GetDateValue()

    MsgBox Format(DateValue("2017/08/01"), "yyyy/mm/dd hh:nn:ss")

End Sub

実行結果

DateValueで日付値を求めた場合、時刻は00:00:00になります。


TimeValue

文字列から時刻値を取得するには、TimeValue関数を使います。
Sub GetTimeValue()

    MsgBox Format(TimeValue("10:10"), "yyyy/mm/dd hh:nn:ss")
    
End Sub

実行結果

TimeValueで時刻値を求めた場合、日付は1899/12/30になります。これはVBAで1899/12/30のシリアル値が0となっているためです。


<参考サイト>
DateValue 関数 | Office VBA 言語リファレンス
TimeValue 関数 | Office VBA 言語リファレンス

2017年7月21日

【Excel】日付や時刻の指定した部分を取得するマクロ(その2)


前回、DatePart関数を使った方法を紹介しましたが、日付や時刻の指定した部分を取得するには他にも方法があります。

年、月、日、時、分、秒、曜日を取得するには、それぞれ Year、Month、Day、Hour、Minute、Second、Weekday関数を使います。

Sub GetDateTimeElement()

    MsgBox "現在日時:" & Now & vbCrLf & vbCrLf & _
           "   年:" & Year(Now) & vbCrLf & _
           "   月:" & Month(Now) & vbCrLf & _
           "   日:" & Day(Now) & vbCrLf & _
           "   時:" & Hour(Now) & vbCrLf & _
           "   分:" & Minute(Now) & vbCrLf & _
           "   秒:" & Second(Now) & vbCrLf & _
           "  曜日:" & Weekday(Now)

End Sub

実行結果



<参考サイト>
Year 関数 | Office VBA 言語リファレンス
Month 関数 | Office VBA 言語リファレンス
Day 関数 | Office VBA 言語リファレンス
Hour 関数 | Office VBA 言語リファレンス
Minute 関数 | Office VBA 言語リファレンス
Second 関数 | Office VBA 言語リファレンス
Weekday 関数 | Office VBA 言語リファレンス

2017年7月20日

【Excel】日付や時刻の指定した部分を取得するマクロ


日付や時刻の指定した部分を取得するには、DatePart関数を使います。

Sub GetDatePart()

    MsgBox "現在日時:" & Now & vbCrLf & vbCrLf & _
           "   年:" & DatePart("yyyy", Now) & vbCrLf & _
           "   月:" & DatePart("m", Now) & vbCrLf & _
           "   日:" & DatePart("d", Now) & vbCrLf & _
           "   時:" & DatePart("h", Now) & vbCrLf & _
           "   分:" & DatePart("n", Now) & vbCrLf & _
           "   秒:" & DatePart("s", Now) & vbCrLf & _
           "  曜日:" & DatePart("w", Now) & vbCrLf & _
           "   週:" & DatePart("ww", Now) & vbCrLf & _
           " 四半期:" & DatePart("q", Now) & vbCrLf & _
           " 通算日:" & DatePart("y", Now)

End Sub
第1引数で取り出したい時間の間隔を指定します。この設定値については下記の表を参照してください。

実行結果



第1引数(時間間隔)の設定値
設定 説明
yyyy
q 四半期
m
y 通日
d
w 曜日
ww
h 時間
n
s



<参考サイト>
DatePart 関数 | Office VBA 言語リファレンス