naobe @ ウィキ

VBA

最終更新:

Bot(ページ名リンク)

- view
管理者のみ編集可
言語に戻る

バージョン

VB6.0

コメント

行先頭にシングルコーテーション

説明
Boolean 真偽値。True or False
String 文字列
Integer 整数(負数あり)。16ビット

制御構造

判定

 If 条件式 then
 ステートメント
 ElseIf 条件式 then
 ステートメント
 Else
 ステートメント
 End If

ループ

 Do [while 条件式]
 [exit Do] #ループから抜ける
 Loop
whileがない場合は無限ループ

クラス

不可能なこと

  • 継承
  • オーバーロード

作成方法

コーディング例


文字列

文字列の連結

 文字列1 & 文字列2

FORM

テキストボックス

【テキストボックスから文字列を取得する】

ボタン

【フォームを閉じる】
 Unload me

正規表現

使用方法は以下を参照
 '
 ' 正規表現マッチ判定
 '
 '@param patn 正規表現パターン
 '@param target 対象文字列
 '
 Private Function regmatch(patn As String, target As String) As Boolean
  Dim re
 	  Set re = CreateObject("VBScript.RegExp")
     
     re.Pattern = patn
     regmatch = re.Test(target)
 End Function

プログラミング例

DB2のselect結果を取得

【select結果】
'-'の数が、列の桁数になる。
 STORENUM   STARTDATE  NAME                 OPSTATE
 ---------- ---------- -------------------- -----------
 st001      2011-06-01 store1                         0
 st001      2011-06-02 store1                         1
 st001      2011-06-03 store1                         1
 st002      2011-06-02 store2                         0
 st002      2011-06-03 store2                         1
 st002      2011-06-04 store2                         1
 st003      2011-06-03 store3                         0
 st003      2011-06-04 store3                         1
 st003      2011-06-05 store3                         1

【シートプログラム】
 Option Explicit
 
 ' 出力開始セル
 Private startCell As Range
 
 ' データ開始セル
 Private dataCell As Range
 
 ' [[SQL]]ファイルパス
 Private sqlFilePath As String
 
 ' 支店EXCELディレクトリ(フルパス)
 Private branchDir As String
 
 ' 支店加盟店番号セル
 Private branchShopNumCell As String
 
 ' 支店加盟店番号セル
 Private branchShopNameCell As String
 
 ' 列リスト
 Private colList As Collection
 
 ' 列サイズ
 Private colSize As Integer
 
 ' ヘッダ
 Private header As String
 
 ' データ行到達フラグ
 Private isData As Boolean
 
 ' 終了フラグ
 Private isEnd As Boolean
 
 
 ' 加盟店マップ(キー:加盟店番号、値:加盟店名)
 Private shopMap As Dictionary
 
 Private Sub テスト_Click()
     Dim result As Boolean
     result = regmatch("\d{4}-\d{2}-\d{2}-\d{2}\.\d{2}\.\d{2}\.\d{6}", "2013-04-23-10.00.00.000002")
     
     MsgBox ("結果 : " & CStr(result))
     
 End Sub
 
 '
 ' 支店ディレクトリから支店excelファイルを読み込み、加盟店番号と加盟店名のマップを作成する
 ' SQLダンプファイルを読み込み保管する
 '
 Private Sub 実行_Click()
     Dim i As Integer
     
     ' 変数初期化
     isData = False
     isEnd = False
     Set startCell = Worksheets(SHEET_NAME).Range(START_CELL)
     Set dataCell = startCell.Offset(1, 0)
     Set shopMap = New Dictionary
     Set colList = New Collection
     
     ' 設定読み込み
     Call getConfig
     
     ' 支店EXCELファイルを読み込み、加盟店番号-加盟店名マップを作成
     Call createShopMap
     
     ' SQL読み込み
     Call readSQL
 
 End Sub
 
 '
 ' 設定値読み込み
 '
 Private Sub getConfig()
     sqlFilePath = Range(SQL_FILE_PATH).Value
     branchDir = Range(BRANCH_EXCELL_DIR).Value
     branchShopNumCell = Range(BRANCH_SHOP_NUM).Value
     branchShopNameCell = Range(BRANCH_SHOP_NAME).Value
 End Sub
 
 
 '
 ' 支店EXCELファイルを読み込み、加盟店マップ作成
 '
 Private Sub createShopMap()
     Dim f, fs, folder, fc
     Dim wb As Workbook
     Dim fileName, shopNum, shopName As String
 
     Set fs = CreateObject("Scripting.FileSystemObject")
     '支店EXCELファイルフォルダ
     Set folder = fs.GetFolder(branchDir)
     'フォルダ内のファイル
     Set fc = folder.Files
     For Each f In fc
         'ワークブックを開く
         fileName = branchDir & "\" & f.name
         'Debug.Print ("fileName : " & fileName)
         Set wb = Workbooks.Open(fileName:=fileName)
         
         '加盟店番号、加盟店名をマップに登録
         shopNum = wb.Sheets(1).Range(branchShopNumCell).Value
         shopName = wb.Sheets(1).Range(branchShopNameCell).Value
         'Debug.Print "shopNum : " & shopNum & " shopName : " & shopName
         shopMap.Add shopNum, shopName
         
         'ワークブックを閉じる
         wb.Close
     Next
 
     ' 加盟店マップダンプ
     Call dumpMap("加盟店番号", "加盟店名", shopMap)
     Debug.Print ""
 End Sub
 
 '
 ' 加盟店マップダンプ
 '
 '@param keyName キー名
 '@param valueName 値名
 '@param map ダンプするマップ
 '
 Private Sub dumpMap(keyName As String, valueName As String, map As Dictionary)
     Dim keyAry
     Dim i As Integer
     Dim val As String
     
     keyAry = map.keys
     For i = 0 To map.Count - 1
         val = map.Item(keyAry(i))
         Debug.Print keyName & " : " & keyAry(i) & ", " & valueName & " : " & val
     Next
 End Sub
 '
 ' SQL select結果をシートにロードする
 '
 Public Sub readSQL()
     Dim fileNo As Integer
     Dim buf As String
     Dim ret As Integer
     
     fileNo = FreeFile
     Open sqlFilePath For Input As #fileNo
     Do Until EOF(fileNo)
         Line Input #fileNo, buf
         Call loadToSheet(buf)
     Loop
     Close #fileNo
 End Sub
 
 '
 ' 行をシートに登録する
 '
 '@paarm line 行
 '@param sheetName シート名
 '
 Public Sub loadToSheet(line As String)
     ' 行マップ(キー:カラム名、値:カラム値)
     Dim lineMap As Dictionary
     
     Dim top As String
     If isData = False Then
         ' ヘッダ行処理
         ' 空行は終了
         If Len(line) = 0 Then
             Exit Sub
         End If
         top = Mid(line, 1, 1)
         '---行まで進む
         If top = "-" Then
             isData = True
             ' 列サイズ取得
             Call extractColSize(line)
             ' ヘッダ行から列名取得
             Call getColumnName
         Else
             ' ---行まで、ヘッダ行保管
             header = line
         End If
     Else
         ' データ行処理
         ' 空行になったら終了
         If Len(line) = 0 Then
             isEnd = True
             Exit Sub
         End If
         ' 終了なら何もしない
         If isEnd = True Then
             Exit Sub
         End If
         ' データ行
         'Call writeData(line)
         Set lineMap = getLineMap(line)
         ' 行マップダンプ
         Call dumpMap("名前", "値", lineMap)
         Debug.Print ""
     End If
 End Sub
 
 '
 ' 列サイズ抽出
 '
 '@param line ---の行
 '
 Sub extractColSize(line As String)
     Dim pos, prevPos, start As Integer
     
     start = 0
     prevPos = 1
     pos = -1
     ' 行からブランクを探す
     Do While True
         Dim col As ColumnClass
         Set col = New ColumnClass
         pos = InStr(prevPos, line, " ")
         If pos = 0 Then
             '最後の列の列サイズを保管
             col.size = Len(line) - prevPos + 1
             colList.Add col
             Exit Do
         Else
             ' 列サイズを保管
             col.size = pos - prevPos
             colList.Add col
             prevPos = pos + 1
         End If
     Loop
 End Sub
 
 '
 ' ヘッダから列名を取得する
 '
 Private Sub getColumnName()
     Dim i, pos As Integer
     Dim col As ColumnClass
     
     pos = 1
     For i = 1 To colList.Count
         'colAry(i).name = Trim(Mid(header, pos, colAry(i).size))
         Set col = colList.Item(i)
         col.name = Trim(Mid(header, pos, col.size))
         pos = pos + col.size + 1
     Next
 End Sub
 '
 ' データ行をシートに書き込む
 '
 '@param line データ行
 '
 Private Function getLineMap(line As String) As Dictionary
     Dim pos, i As Integer
     Dim lineMap As Dictionary
     Dim col As ColumnClass
     
     Set lineMap = New Dictionary
         
     pos = 1     'カラム位置
     'データ出力
     For i = 1 To colList.Count
         Set col = colList.Item(i)
         ' データ行から値を取得してマップに登録
         lineMap.Add col.name, Trim(Mid(line, pos, col.size))
         ' 次のカラム位置を計算
         pos = pos + col.size + 1
     Next
     Set getLineMap = lineMap
 End Function
 
 '
 ' データ行をシートに書き込む
 '
 '@param line データ行
 '
 Private Sub writeData(line As String)
     Dim pos, i As Integer
     '開始セル
     Dim tmpCell As Range
     Set tmpCell = dataCell
         
     pos = 1
     'データ出力
     For i = 0 To colSize
         ' 表示形式を文字列に設定
         tmpCell.NumberFormatLocal = "@"
         'ファイルの行から値を取得してセルに設定
         tmpCell.Value = Trim(Mid(line, pos, colAry(i).size))
         ' 1列右へ移動
         Set tmpCell = tmpCell.Offset(0, 1)
         pos = pos + colAry(i).size + 1
     Next
     ' dataCellを1行下へ移動
     Set dataCell = dataCell.Offset(1, 0)
 End Sub
 
 
 '
 ' 正規表現マッチ判定
 '
 '@param patn 正規表現パターン
 '@param target 対象文字列
 '
 Private Function regmatch(patn As String, target As String) As Boolean
     Dim re
     Set re = CreateObject("VBScript.RegExp")
     
     re.Pattern = patn
     regmatch = re.Test(target)
 End Function

【標準モジュール】
 Option Explicit
 
 '出力シート名
 Public Const SHEET_NAME As String = "Sheet2"
 
 ' 最大列数
 Public Const MAXCOL As Integer = 50
 
 ' 出力開始設定セル
 Public Const START_CELL As String = "B2"
 
 ' SQLダンプファイル(フルパス)設定セル
 Public Const SQL_FILE_PATH As String = "C4"
 
 ' 支店EXCELディレクトリ(フルパス)設定セル
 Public Const BRANCH_EXCELL_DIR As String = "C5"
 
 ' 支店加盟店番号セル設定セル
 Public Const BRANCH_SHOP_NUM As String = "C7"
 
 ' 支店加盟店番号セル設定セル
 Public Const BRANCH_SHOP_NAME As String = "C8"

【クラスモジュール ColumnClass】
 Option Explicit
 
 Public size As Integer 'サイズ
 Public name As String  '名前

ファイル書き込み

 Private Sub FileWrite_Click()
     ' 変数宣言
     Dim fileName As String                      ' 書き込みファイル名
     Dim rows As Variant
     Dim row As Integer
     Dim fileNumber As Integer
     Dim fileExist As String
     
     fileNumber = FreeFile
     
     ' ファイル名をセルから読み込み
     fileName = Range("C13").Value
     
     ' 書き込む文字列を取得
     rows = Range("C18", "C21")
     
     ' ファイルがあれば削除
     fileExist = Dir(fileName)
     If fileExist <> "" Then
         Kill fileName
     End If
     
     ' ファイル書き込み
     Open fileName For Append As #fileNumber
     For row = 1 To 4
         Print #fileNumber, rows(row, 1)
     Next
     Close #fileNumber
 
     MsgBox "ファイル:" & fileName & "に文章を書き込みました"
 
 End Sub

指定したセルから値を取得してSQL作成

【標準モジュール】
 Option Explicit
 
 ' 検索開始行
  Const START_ROW = 4
 
 ' 検索終了行
  Const END_ROW = 10
 
 ' NAMEID列
 Const NAMEID_COL = 2
 
 
 Sub SQL作成_Click()
     ' NAMEID
     Dim nameIdCell As Range
     ' 行
     Dim row As Integer
     ' ID
     Dim id As Integer
     ' 文字列ID
     Dim sid As String
     
     ' 初期値を設定
     row = START_ROW
     id = 1
     
     ' 最終行まで、SQL文作成
     Do While row <= END_ROW
         Set nameIdCell = Cells(row, NAMEID_COL)
         ' id を3桁で0埋め
         sid = PadLeft(CStr(id), 3, "0")
         ' SQL文出力
         Debug.Print "insert into INOUTDETAIL values('D20120304" & sid & "', 'その他', '" & nameIdCell.Value & "');"
         row = row + 1
         id = id + 1
     Loop
     Debug.Print "commit work;"
 
 End Sub
 
 ' -------------------------------------------------------------------------------
 '       指定の文字数になるまで先頭を文字で埋めます。
 '
 ' @Param    stTarget    処理対象となる文字列。
 ' @Param    iLength     文字の長さ。
 ' @Param    [chOne]     埋める文字。(省略時は半角スペース)
 ' @Return               先頭を指定の文字で iLength の長さまで埋められた文字列。
 ' -------------------------------------------------------------------------------
 Public Function PadLeft(ByVal stTarget As String, ByVal iLength As Integer, Optional ByVal chOne A  s String = " ") As String
     Do While (Len(stTarget) < iLength)
         stTarget = chOne & stTarget
     Loop
 
     PadLeft = Right$(stTarget, iLength)
 End Function

英単語帳に単語登録機能を追加する


【フォームモジュール】
 Option Explicit
 
 ' 検索開始セル
 Const START_CELL = "C5"
 
 '左端列
 Const START_COLUMN = "B"
 
 '右端列
 Const END_COLUMN = "F"
 
 '品詞マップ
 Dim hinshiMap As Object
 
 '
 ' フォーム初期処理
 '
 Private Sub UserForm_Initialize()
     '品詞初期化
     Dim hinshiNameAry() As String
     Dim hinshiValAry() As String
     hinshiNameAry = Split(MEISI & "," & MEISI_DOUSI & "," & DOUSI & "," & KEIYOUSI & "," & HUKUSI   & "," & ZENTISI, ",")
     hinshiValAry = Split(MEISI_VAL & ":" & MEISI_DOUSI_VAL & ":" & DOUSI_VAL & ":" & KEIYOUSI_VAL   & ":" & HUKUSI_VAL & _
                         ":" & ZENTISI_VAL, ":")
     'コンボボックス初期化
     With hinshi
         Dim i As Integer
         For i = 0 To HINSHI_CNT - 1
             .AddItem hinshiNameAry(i)
         Next i
         .Text = .List(0)
     End With
 
     '品詞マップに登録
     Set hinshiMap = CreateObject("Scripting.Dictionary")
     With hinshiMap
         For i = 0 To HINSHI_CNT - 1
             .Add hinshiNameAry(i), hinshiValAry(i)
         Next i
     End With
 End Sub
 
 '
 ' 追加ボタン押下処理
 '
 Private Sub AddButton_Click()
     Dim 単語 As String
     Dim 品詞 As String
     Dim 訳 As String
     
     単語 = word.Text
     品詞 = hinshiMap.Item(hinshi.Text)
     訳 = translation.Text
         
     Debug.Print "追加ボタンがクリックされました。 単語:" & 単語 & " 品詞:" & 品詞 & " 訳:" + 訳
     
     'シートへ登録
     '  追加する位置のセルを求める
     Dim targetCell As Range
     Dim tmpCell As Range
     Set targetCell = findTargetCell(単語)
     If targetCell Is Nothing Then
         MsgBox prompt:="既に登録されています", Buttons:=vbCritical
         Exit Sub
     End If
     
     Debug.Print "追加するセル位置:" & targetCell.Address
     
     '  行を追加
     targetCell.EntireRow.Insert
     
     ' 先頭に追加か否かで、Noをコピーする行を変える
     If targetCell.Address = Range(START_CELL).Offset(1, 0).Address Then
         '先頭に追加
         '  Noをコピー
         Set tmpCell = targetCell.Offset(0, -1)
         tmpCell.Copy Destination:=tmpCell.Offset(-1, 0)
         '  形式をコピー
         Dim rangeStr As String
         rangeStr = getRangeStr(tmpCell.row)
         Range(rangeStr).Copy
         rangeStr = getRangeStr(tmpCell.row - 1)
         Range(rangeStr).PasteSpecial Paste:=xlPasteFormats
     Else
         '  2行上(No)をコピー
         Set tmpCell = targetCell.Offset(-2, -1)
         tmpCell.Copy Destination:=tmpCell.Offset(1, 0)
     End If
     
     ' 空行に移動
     Set targetCell = targetCell.Offset(-1, 0)
     ' 入力値をセット
     targetCell.Value = 単語
     targetCell.Offset(0, 1).Value = 品詞
     targetCell.Offset(0, 2).Value = 訳
     
     ' 日付をセット
     targetCell.Offset(0, 3).NumberFormatLocal = "yyyy/m/d"
     targetCell.Offset(0, 3).Value = Date
 End Sub
 
 '
 '範囲文字を取得する
 '
 '引数 row 行
 '戻り値 範囲文字列(ex. "A1:C3")
 '
 '
 Private Function getRangeStr(row As Long)
     getRangeStr = START_COLUMN & CStr(row) & ":" & END_COLUMN & CStr(row)
 End Function
 
 '
 ' キャンセルボタン押下処理
 '
 Private Sub CancelButton_Click()
     ' 閉じる
     Unload Me
 End Sub
 
 '
 ' 追加するセル位置を求める
 '
 ' 引数 wordVal 単語
 ' 戻り値 追加するセル。同じ単語があればNothing
 '
 Private Function findTargetCell(wordVal As String)
     ' 単語比較結果
     Dim compResult As Integer
     ' 比較対象セル
     Dim targetCell As Range
     
     Set targetCell = Range(START_CELL)
     ' 検索
     Dim isSameWord As Boolean
     isSameWord = False
     Do
         '最終行チェック
         If targetCell.Value = Empty Then
            Exit Do
         End If
         compResult = StrComp(targetCell.Value, wordVal, vbTextCompare)
         'セルの文字列が追加単語より後なら終了
         If compResult = 1 Then
             ' 同じ単語か確認
             If targetCell.Offset(-1, 0).Value = wordVal Then
                 Set targetCell = Nothing
             End If
             Exit Do
         End If
         ' 1行下に移動
         Set targetCell = targetCell.Offset(1, 0)
     Loop
 
     ' 戻り値
     Set findTargetCell = targetCell
 End Function
 
 
 '
 ' セル形式を変換する
 '
 ' 引数 rangeName $A$1形式のセル名
 ' 戻り値 A1形式のセル名
 '
 Private Function cnvRangeForm(rangeName As String)
     ' $を削除
     cnvRangeForm = Replace(rangeName, "$", "")
 End Function
 
【シートモジュール】
 Option Explicit
 
 Private Sub CommandButton1_Click()
     UserForm1.Show vbModal
 End Sub

【標準モジュール】
 Option Explicit
 
 '品詞名
 Public Const MEISI = "名詞"
 Public Const DOUSI = "動詞"
 Public Const MEISI_DOUSI = "名詞+動詞"
 Public Const KEIYOUSI = "形容詞"
 Public Const HUKUSI = "副詞"
 Public Const ZENTISI = "前置詞"
 
 '品詞
 Public Const MEISI_VAL = "n"
 Public Const DOUSI_VAL = "v"
 Public Const MEISI_DOUSI_VAL = "n,v"
 Public Const KEIYOUSI_VAL = "a"
 Public Const HUKUSI_VAL = "adv"
 Public Const ZENTISI_VAL = "prep"
 
 '品詞の数
 Public Const HINSHI_CNT = 6
添付ファイル
ウィキ募集バナー