アットウィキロゴ
naobe @ ウィキ
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

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
添付ファイル
最近更新されたスレッド
人気記事ランキング
ウィキ募集バナー