Ta-kaku.jp Tools
Update 2010/02/06
技術メモ内容
トップページ
ハードやソフトの技術メモです。 ほとんど、個人の備忘録のレベルですので高度なことは書かれていません。 皆様に少しでもお役に立てれば幸いです。
MENU
Visial Basic
サイト更新情報
2008/10/18
「Ta-kaku Tools 住所検索・郵便番号検索・事業所名検索・駅検索・電話局番検索」を Ver2.202 にリビジョンアップしました。
更新内容は以下の通りです。
・「xxx1丁目」の様に「全角の数字」と「丁目」が続いている文字列が入力されると検索できない事がある不具合を改修しました。
2008/10/01
Ta-kaku Tools Whois検索 Ver1.000をリリースしました。
2008/09/30
「Ta-kaku Tools 住所検索・郵便番号検索・駅検索・電話番号(局番)検索 」を Ver2.201 にリビジョンアップしました。
更新内容は以下の通りです。
・電話番号(局番)検索機能を正式版にしました。 ・無効な数値に対して住所の検索を行っていた処理を改善しました。 ・局番0120指定でGoogleMapがおかしな場所を示していた不具合を修正しました。 ・「東京駅駅」のように入力されると、関係の無いデータが出力される不具合を修正しました。
過去の情報
関連キーワード
技術メモ インデックス
カテゴリーを選択してください。
インストール
プログラミング言語
マークアップ言語
データベース言語
スクリプト言語
MS-Office
その他
Webアプリケーション
の開発方法
Visial Basic 技術メモ
追加日時の新しい方から掲載しています。
画面遷移
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.スムーズな画面遷移
    呼び元
        Load <次の画面フォーム>

    遷移先
        Form_Load
            画面の編集
            vaSpread.MaxRows = 0
            Me.Show
            Me.Refresh
            <前の画面フォーム>.Hide
            スプレットなどの時間のかかる処理
スプレットシート(Power Tools SPREAD Ver7.0J)
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.処理高速化

    vaSpread.ReDraw = False                             'スプレットの描画一時停止
        : 処理
    vaSpread.ReDraw = True                              'スプレットの描画開始

2.最終行と列が表示されている場合、それ以上スクロールさせないようにするには

    [表示]-[スクロールバー]-[スクロールバー]-[最終のセルを表示領域の右下隅に合わせる]
    この項目を ON にする。

3.行選択を解除するには
    spreadPopMenu_Sel_Click()内においてブロックセレクトを行う事で選択を
    強制解除させる方法

    Dim topRow As Long                                  '選択の先頭位置の確保用
        :
    With vaSpread
        :
    selRow = 0
    topRow = 0                                          '選択の先頭位置初期化
    For rowCnt = 1 To .MaxRows
        If True = .IsCellSelected(FNAMECHG_COL_SEL, rowCnt) Then
            selRow = selRow + 1
            If 0 = topRow Then                          '初回のみ
                topRow = rowCnt                         '先頭位置の確保
            End If
        End If
    Next
        :
    '視覚効果(選択を解除して選択されていた先頭の行にカーソルを合わせる)
    If 0 < topRow Then
        .Col = 1
        .Row = topRow
        .Col2 = 1
        .Row2 = topRow
        .Action = SS_ACTION_SELECT_BLOCK
    End If
        :
    End With
ブラウザー操作
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.ブラウザー起動
    Public Const SW_SHOWNORMAL = 1
    Public Declare Function ShellExecute Lib "shell32.dll" Alias 
    "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, 
       ByVal lpFile As String, ByVal lpParameters As String, 
    ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long

    Private Sub Text1_Click()
    Dim workResult As Long
    workResult = ShellExecute(Me.hwnd, "open", Text1.Text, 
    vbNullChar, vbNullChar, SW_SHOWNORMAL)
    End Sub
Outlook操作
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.メール送信
    Dim objApp As Object     'Outlookアプリケーションオブジェクト
    Dim objMail As Object    'メールオブジェクト
    Dim workBuf As String

    Set objApp = CreateObject("Outlook.Application")    'Outlook起動
    Set objMail = objApp.CreateItem(0)                  'メール作成

    '本文サンプル
    workBuf = "row1" & vbCrLf _
            & "row2" & vbCrLf _
            & "row3" & vbCrLf

    With objMail
    .Importance = 2                                     '重要度(0=低, 1=中, 2=高)
    .To = "xxx@xxx.xxx"                                 'メールアドレス
    .Subject = "Test Mail"                              '件名
    .Body = workBuf                                     '本文セット
    .Attachments.Add "C: est.txt"                      '添付ファイルセット
    .Send                                               '送信
    End With

    Set objMail = Nothing                               'エリアの開放
    Set objApp = Nothing                                '   〃
EXCEL操作
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.高速化
    変更内容を編集後に反映(もちろん読み込み時は効果なし)
        xlSheet.Application.ScreenUpdating = False 'シートの変更内容を反映しない
            編集処理
        xlSheet.Application.ScreenUpdating = True  'シートの変更内容を反映する

    一括編集
        次のブロックデータをEXCELに送る
        +-----+-----+-----+
        | aaa | bbb | ccc |
        +-----+-----+-----+
        | 123 | 456 | 789 |
        +-----+-----+-----+

        Dim workBuf() As Variant

        ReDim workBuf(2, 3)

        workBuf(1, 1) = "aaa"
        workBuf(1, 2) = "bbb"
        workBuf(1, 3) = "ccc"

        workBuf(2, 1) = "123"
        workBuf(2, 2) = "456"
        workBuf(2, 3) = "789"

        With xlSheet
        .Range(.Cells(開始行, 開始列), .Cells(終了行, 終了列)).Value = workBuf()
        End With

    事前バインディング
        変数 xlApp1 を使ったコードは事前バインディングであり、変数 xlApp2 を使った
        実行時バインディングのコードより高速に実行される

        Dim xlApp1 As Excel.Application
        Set xlApp1 = New Excel.Application

        Dim xlApp2 As Object
        Set xlApp2 = CreateObject("Excel.Application")

2.クリップボード経由のブロック編集
    次のブロックデータをEXCELに送る
    +-----+-----+-----+
    | aaa | bbb | ccc |
    +-----+-----+-----+
    | 123 | 456 | 789 |
    +-----+-----+-----+

    Dim setStr as String

    Clipboard.Clear
    setStr = "aaa" & vbTab & "bbb" & vbTab & "ccc" & vbCrlf _
             "123" & vbTab & "456" & vbTab & "789" & vbCrLf

    'クリップボードにコピー
    Clipboard.SetText setStr, vbCFText

    '貼り付ける範囲を文字列に指定してからPaste
    XlSheet.ActiveSheet.Range("A1").Select
    XlSheet.ActiveSheet.Paste

3.ファイルの編集基本パターン
    Dim xlSheet As Object                               'Excelシート

    Set xlSheet = CreateObject("Excel.application")     'Excelの起動
    With xlSheet
    .Application.Visible = False                        '非表示
    .Application.ScreenUpdating = False                 'シートの変更内容を反映しない
    .workbooks.Open FileName:=formatFile                'フォーマットファイルを指定して
        :                                               '    EXCELブックをオープン
        : 処理
        :
    .Application.ScreenUpdating = True                  'シートの変更内容を反映する
    .activeworkbook.Close savechanges:=True             'セーブして終了
                                                         (印刷のみに使用する場合は False)
    .Application.Quit                                   'Excelの終了
    End With
    Set xlSheet = Nothing                               'エリアの開放
ショートカット
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.プログラムでショートカットを作成

    Declare Function fCreateShellLink Lib "STKIT432.DLL" ( _
          ByVal lpstrFolderName as String _ '?ショートカットを作成するフォルダを、
                                               スタートメニューのプログラムフォルダ
                                               を基点とした相対パスで記述
        , ByVal lpstrLinkName as String _   '?ショートカット名称
        , ByVal lpstrLinkPath as String _   '?ファイルパス
        , ByVal lpstrLinkArgs as String     '?ショートカットに付けたい引数
    ) As Long
最小化フォーム
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.最小化されたフォームからのユーザーへの通知
    タスクバーに入った、最小化状態のフォームのアイコンを変えることで、
    ユーザーに対して合図を送る

    'フォームに Timer と ImageList の 2 つのコントロールをセット
    'Timer の Interval プロパティを2000(2秒)にセットし、
     ImageList の Custom プロパティを使い、表示させるイメージを3つ加える
    '最後に、Timer イベントに、次のようなコードを記述
    Private Sub Timer_Timer()
        Static ilmage As Integer

        ilmage = ilmage + 1
        If 3 < ilmage Then
            ilmage = 1
        End If
        Me.Icon = ImageList.ListImages(ilmage).Picture
    EndSub
コンボボックス
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.コンボボックスにオートコンプリート機能を追加する

    'サンプルコード
    Public Const CB_FINDSTRING = &H14C

    Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    ( _
          ByVal hwnd As Long _
        , ByVal wMsg As Long _
        , ByVal wParam As Long _
        , lParam As Any _
    ) As Long

    Private Sub Combo_Change()
        Dim iStart As Integer
        Dim sString As String
        Static iLeftOff As Integer

        iStart = Combo.SelStart              'Combo.SelStart の値を保持
        If 0 <> iLeftOff Then
            Combo.SelStart = iLeftOff
            iStart = iLeftOff
        End If

        '入力した文字の右に文字があっても、現在入力位置で候補検索を行う
        sString = CStr(Left(Combo.Text, iStart))

        'SendMessage は、入力した文字が候補群になかった場合、-1 を返す
        Combo.ListIndex = SendMessage(Combo.hwnd, CB_FINDSTRING, 
                          -1, ByVal CStr(Left(Combo.Text, iStart)))

        If -1 = Combo.ListIndex Then

            'sStringには、入力した文字列が先頭から格納されている
            iLeftOff = Len(sString)  'iLeftOffには、入力した文字数が格納される
            Combo.Text = sString
        End If

        '保持していた SelStart の値を元に戻す
        Combo.SelStart = iStart
        Combo.SelLength = Len(Combo.Text)
        iLeftOff = 0

    End Sub
テキストボックス
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.リードオンリーのテキストボックス
    Textbox の keypress イベントに、keyascii=0 と記述する

    'サンプルコード
    Private Sub Text_KeyPress(KeyAscii As Integer)
       KeyAscii = 0
    End Sub

2.フォーカス取得時にコントロールのテキストを選択する

    'コントロールの Got_Focus イベントから下に示したようなサブルーチンを呼ぶことにより、
    'フォーカスが移ったときにテキストボックスの内容の全てを選択することが可能
    Public Sub SelAllText()
        Screen.ActiveControl.SelStart = 0
        Screen.ActiveControl.SelLength = Len(Screen.ActiveControl.Text)
    End Sub
ポップアップメニュー
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.テキストボックスのポップアップメニューをカスタマイズする
    ?目的のフォームにメニューエディタメニューを作成
    ?Textbox の MouseDown イベントにサンプルコードの要領で記述

        'サンプルコード
        If vbRightButton = Button Then
            Text.Enabled = False
            Text.Enabled = True
            Text.SetFocus
            PopUpMenu Menu
        End If
時間の取得
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.今日からの日数
    Dim getBuf As String
    getBuf = "今日からの日数=[" & DateDiff("d", Now, "2000/01/01")

2.ファイルスタンプの表示を変更
    MsgBox Format(FileDateTime("test.txt"), "YYYY/MM/DD hh:mm:ss")
ファイルの操作
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.指定したファイルの作成日時または最後に修正した日時の取得
    Dim getDate As Variant                     '内部処理形式 Date の Variant)
    getDate = FileDateTime("TestFile.txt")

2.ファイルポインタを先頭に移動
    Seek #fileNo, 1                            'ファイルポインタを先頭に移動

3.ファイルを1行毎に最後まで読み込む
    Dim fileNo As Integer
    Dim getBuf As String
    fileNo = FreeFile
    Open "TEST.txt" For Input As #fileNo
    Do While Not EOF(fileNo)
        Line Input #fileNo, getBuf
            :
            : 略
            :
    Loop
    Close #fileNo

4.ファイル名の変更
    Name OldName As NewName

5.ファイルオープン/書込み/クローズ
    Dim fileNo As Integer
    fileNo = FreeFile
    Open "TEST.txt" For Output As #fileNo
    Print #fileNo, "書き込む内容" ;            '改行なし
    Print #fileNo, "書き込む内容"              '改行あり
    Close #fileNo
    Reset                                      'バッファの内容をディスクに書き込む

6.ファイルをコピーする
    'FileSystemObjectを使用する場合は、
    '    [参照設定]に[Microsoft Scripting Runtime]が必要
    Dim fileSysObj As FileSystemObject
    Set fileSysObj = New FileSystemObject           'オブジェクトを生成する
    fileSysObj.CopyFile source, destination, True   'Trueで上書き
    Set fileSysObj = Nothing                        'オブジェクトを削除する

7.リストボックス連携

    'ドライブ変更時
    Private Sub Drive1_Change()
        Dir1.Path = Drive1.Drive
    End Sub

    'フォルダー変更時
    Private Sub Dir1_Change()
        File1.Path = Dir1.Path
    End Sub

    'ファイル変更時
    Private Sub File1_Click()
        Label1.Caption = File1.Path

        '末尾のの調整(付いていない場合は付ける)
        If "\" <> Right(Label1.Caption, 1) Then
            Label1.Caption = Label1.Caption & "
キーの判別方法
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.キー判別例

    フォームのプロパティ ... KeyPreview=True

    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        Dim ShiftDown, AltDown, CtrlDown

        Const vbShiftMask = 1
        Const vbCtrlMask = 2
        Const vbAltMask = 4
        ShiftDown = (Shift And vbShiftMask) > 0
        AltDown = (Shift And vbAltMask) > 0
        CtrlDown = (Shift And vbCtrlMask) > 0

        Select Case KeyCode
        Case vbKeyF1
            'F1キーを押されたらここを通る
        Case vbKeyF2
        Case vbKeyF3
        Case vbKeyF4
        Case vbKeyF5
        Case vbKeyF6
        Case vbKeyF7
        Case vbKeyF8
        End Select
    End Sub
プログラムの起動関係
登録日:-1/11/30   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.二重起動防止の方法
    ?App.PrevInstanceを使用する場合 ... お勧め

    Form_Load
        Dim szCaption As String

        If App.PrevInstance Then
            szCaption = Me.Caption
            AppActivate szCaption
            SendKeys "% R", True  '元のサイズに戻す(アイコンでない場合は無視)
            End
        End If
    End Sub

    ?ミューテックスを使用する場合
        Public Const MUTEX_ALL_ACCESS& = &HF0000 + &H100000 + &H1&

        'ミューテックスオブジェクトを作成
        Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" _
        ( _
              ByVal lpMutexAttributes As Long _
            , ByVal bInitialOwner As Long _
            , ByVal lpName As String _
        ) As Long

        '既存のミューテックスオブジェクトハンドルを取得
        Declare Function OpenMutex Lib "kernel32" Alias "OpenMutexA" _
        ( _
              ByVal dwDesiredAccess As Long _
            , ByVal bInheritHandle As Long _
            , ByVal lpName As String _
        ) As Long

        If 0 < OpenMutex(MUTEX_ALL_ACCESS, 0, "任意の文字列") Then
            rncEntry_double = False                     '2重起動の場合
        Else
            gMutex_h = CreateMutex(ByVal 0&, False, "任意の文字列")
            rncEntry_double = True                      '初期起動の場合
        End If

        '2重起動防止オブジェクトハンドルの解放
        Call ReleaseMutex(gMutex_h)
        Call CloseHandle(gMutex_h)

2.プログラム実行パスの取得
    gBasePath = App.Path & "\
                    
引数について
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.EXE コマンドライン取得のサンプル
    Private Sub Form_Load()
        Dim cnt As Long
        Dim strArg() As String

        strArg = Split(Command())           'スペースで分割

        '引数は0から始まる
        For cnt = 0 To UBound(strArg)
            MsgBox strArg(cnt)
        Next

    End Sub

2.関数の省略可能引数
    Optional を使用

    'コードサンプル
    Private Sub Command1_Click()
        Call test("AAA", "BBB", "CCC")
        Call test("AAA", "BBB")
        Call test("AAA")
    End Sub

    Sub test(Optional p1 As Variant, Optional p2 As Variant
    , Optional p3 As Variant)
        If False = IsMissing(p1) Then
            MsgBox p1
        End If
        If False = IsMissing(p2) Then
            MsgBox p2
        End If
        If False = IsMissing(p3) Then
            MsgBox p3
        End If
    End Sub
フォームのアンロードの仕方
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.完全なフォームのアンロード
    Unload Me          '表示されている構成要素だけがアンロードされる
    Set Me = Nothing   'フォームが完全にメモリ上から削除される
    End                'プログラムの終了

2.フォームのアンロードサンプル
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If vbFormControlMenu = UnloadMode Then
            'ユーザが[閉じる]ボタンまたは、[Alt]+[F4] で
            'プログラムを終了させようとした場合の処理
        End If
        If vbNo = MsgBox("終了しますか?", vbYesNo + vbQuestion) Then
            Cancel = True                               '終了しない
            Exit Sub
        End If
    End Sub
C言語とのリンク
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.C言語で開発されたDLL等に値を渡す方法
    VBは基本的に    「参照渡し」でパラメータが渡される。
                      ... ByRef(通常省略):先頭のアドレスが渡る
                          プロシージャ内で変更された変数は呼び出し元の
                          変数にも反映されます。
                    「値渡し」 でパラメータを渡すには
                      ... ByVal:値が直接渡る
                          プロシージャ内で変更された引数は呼び出し元の
                          値には反映されません。

    文字列は特殊で、「参照渡し」... 先頭のアドレスが渡る
                    「値渡し」  ... 文字列の先頭のアドレスが渡る
APIについて
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.Win32APIを使用する際の注意
    Windows95は、Unicodeを使用できない

2.Byval As String で宣言された APIパラメータにnullを渡す
    定数 vbNullString を 渡す

3.APIを使ったディスクの容量取得サンプル関数

    GetDiskFreeSpaceEx()は64bitのUINTの値を返す為、
    下位バイトで表現できない値が返る場合は必ず0未満で判定できる。
    Windowsビルド番号が1000以上であること。(Windows95以上であればOK)

    以下をModuleに用意 --->
    Public Type ULARGE_INTEGER
        LowPart As Long
        HighPart As Long
    End Type

    Public Declare Function _
    GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" _
    ( _
        ByVal lpDirectoryName As String, _
        lpFreeBytesAvailableToCaller As ULARGE_INTEGER, _
        lpTotalNumberOfBytes As ULARGE_INTEGER, _
        lpTotalNumberOfFreeByte As ULARGE_INTEGER _
    ) As Long

    '正常終了(True)/異常終了(False)
    '[IN ]pPath         ... パス
    '[OUT]pDwTotalSpace ... ディスク総容量
    '[OUT]pDwFreeSpace  ... ディスク空容量
    Public Function sample_getDiskSpace( _
          pPATH As String _
        , pDwTotalSpace As Double _
        , pDwFreeSpace As Double _
    ) As Boolean

        Dim lpFreeBytesAvailableToCaller As ULARGE_INTEGER
        Dim lpTotalNumberOfBytes As ULARGE_INTEGER
        Dim lpTotalNumberOfFreeByte As ULARGE_INTEGER

        'Win32API
        If False = GetDiskFreeSpaceEx( _
              pPATH _
            , lpFreeBytesAvailableToCaller _
            , lpTotalNumberOfBytes _
            , lpTotalNumberOfFreeByte _
        ) Then
            sample_getDiskSpace = False
            Exit Function
        End If

        'ディスク容量
        pDwTotalSpace = lpTotalNumberOfBytes.HighPart * 2 ^ 32 _
            + lpTotalNumberOfBytes.LowPart
        If lpTotalNumberOfBytes.LowPart < 0 Then
            pDwTotalSpace = pDwTotalSpace + 2 ^ 32
        End If

        '空容量
        pDwFreeSpace = lpTotalNumberOfFreeByte.HighPart * 2 ^ 32 _
            + lpTotalNumberOfFreeByte.LowPart
        If lpTotalNumberOfFreeByte.LowPart < 0 Then
            pDwFreeSpace = pDwFreeSpace + 2 ^ 32
        End If

        sample_getDiskSpace = True

    End Function
    <--- 以上をModuleに用意

    コール側サンプル

    Dim wkDwTotalSpace As Double
    Dim wkDwFreeSpace As Double

    Call sample_getDiskSpace("C:", wkDwTotalSpace, wkDwFreeSpace)
    MsgBox wkDwTotalSpace
    MsgBox wkDwFreeSpace
文字列について
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.正確なバイト数を取得する
    getCount = LenB(StrConv(workBuf, vbFromUnicode))

2.NULLの判定とセット
    ??? = IIf(IsNull(expr), Trueの値, Falseの値)

3.文字列の有無確認
    If 0 < InStr(searchString, searchChar) Then
        '発見した場合の処理
    End If

4.文字列のポインタを取得
    Dim workBuf As String
    ??? = varptr(workBuf)
    'ちなみにオブジェクトのポインタは ... objptr(Label1)

5.文字列変換

    構文
     StrConv(string,conversion)

     '半角文字を全角文字に変換
     StrConv("VBハンカク", vbWide)      → VBハンカク

     '全角文字を半角文字に変換
     StrConv("VBゼンカク", vbNarrow)  → VBゼンカク

     'ひらがなをカタカナに変換
     StrConv("ひらがな", vbKatakana)    → ヒラガナ

     'カタカナをひらがなに変換
     StrConv("カタカナ", vbHiragana)    → かたかな
文字コードについて
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.全角のダブルクォーテーションを使用するには

    全角のダブルクォーテーションはVBで勝手に半角のダブルクォーテーションに変換されてしまう為
    使用できない。
    その場合は、Chr$(&H8168) に置き換えてコードを記述する。
変数について
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.配列の初期化
    Erase を使用

    'コードサンプル
    Dim workBuf(10)
    Erase workBuf

2.構造体の初期化
    WinAPIの ZeroMemory() を使用

    'コードサンプル
    Dim typeBuf As TYPEBUF
    Call ZeroMemory(typeBuf, Len(typeBuf)) ... typeBufのように、直接変数名を指定する
高速化するには
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.With...End With 構文による高速化
    "With...End With" 構文を使えば、そのインスタンスのテンポラリは一つだけで済むようになるので、
    処理が高速になる

2.プロパティー間のピリオド(ドット)を減らす事による高速化
    ドットごとにファンクションコールを行っている
    <対策>
        深い階層のオブジェクトを一時変数に代入
        Withステートメントや For Each ループを使う
基本的な事
登録日:2007/05/07   分類:Microsoft Visual Basic 6.0 Enterprise Edition SP6
1.サフィックス

    Suffix | Data Type
    -------+----------
       &   | Long
       !   | Single
       #   | Double
       @   | Currency

2.変数名のミススペルを回避
    フォームやコードモジュールの宣言セクション に、Option Explicit というステートメントを
    書き加える

3.コードエディター中の位置を記憶
    記述した関数へジャンプする ... SHIFT + F2
    元の場所へ戻る             ... CTRL + SHIFT + F2

4.マウス
    Screen.MousePointer = vbHourglass                   '処理開始
    Screen.MousePointer = vbDefault                     '処理終了
(VB初心者向け)C言語からVBに移行しなければならない方への言語対比
登録日:2000/03/23   分類:言語比較
C言語しか知らなかった私がVBの仕事をしなければならなくなった際に
まとめた言語対比です。
古い情報でしかも舌足らずの所がありますが、何方かにご参考頂ける事
もあるかと思いますので掲載します。

注) C言語に関しては、移植性の弊害となる「Microsoft 固有の仕様」を
    省略しています。

定数
        <C系>
            #define XXX 100L            // 数値型
            #define XXX "TEST"          // 文字型
        <VB系>
            Public Const XXX = 100      ' 数値型
            Public Const XXX = "TEST"   ' 文字型

型
    文字型(基本型)
        <C系>
            char xxx;                   // 整数型1バイト
            unsigned char xxx;          //   〃
        <VB系>
            Dim xxx As Byte             ' バイト型
    整数型(基本型)
        <C系>
            short xxx;                  //   〃  2バイト
            unsigned short xxx;         //   〃
            int xxx;                    //   〃  4バイト
            unsigned int xxx;           //   〃
            long xxx;                   //   〃
            unsigned long xxx;          //   〃
        <VB系>
            Dim xxx As Integer          ' 整数型
            Dim xxx As Long             ' 長整数型

    実数型(基本型)
        <C系>
            float xxx;                  // 浮動小数点型4バイト
            double xxx;                 //   〃        8バイト
            long double xxx;            //   〃
        <VB系>
            Dim xxx As Single           ' 単精度浮動小数点数型
            Dim xxx As Double           ' 倍精度浮動小数点数型
    列挙型
        <C系> .... 変数は int となります
            enum
            {
                a,                      // a(=0)
                b,                      // b(=1)
                c,                      // c(=2) ここの "," は付けてもOK
            };                                   (通常は付けない)

            enum
            {
                a = 10,                 // a(=10)
                b,                      // b(=11)
                c,                      // c(=12)
            };

            enum XXX
            {
                a,                      // a(=0)
                b,                      // b(=1)
                c,                      // c(=2)
            };
            enum XXX x;

            enum XXX
            {
                a,                      // a(=0)
                b,                      // b(=1)
                c,                      // c(=2)
            } x;
                    または
            typedef enum XXX
            {
                a,                      // a(=0)
                b,                      // b(=1)
                c,                      // c(=2)
            } x;

        <VB系> ... 変数は Long となります
            Enum XXX                    ' タグは省略できない
                a                       ' a(=0)
                b                       ' b(=1)
                c                       ' c(=2)
            End Enum

            Enum XXX
                a = 10                  ' a(=10)
                b                       ' b(=11)
                c                       ' c(=12)
            End Enum

            Enum XXX
                a                       ' a(=0)
                b                       ' b(=1)
                c                       ' c(=2)
            End Enum
            Dim x As XXX

    配列型
        <C系>
            // 整数型配列(添字範囲 0?9 の10要素)
            int xxx[10];
            // 整数型2次元配列(添字範囲 0,0?9,9 の100要素)
            int xxx[10][10];
                 行~~~ ~~~列 ... として使用するのが一般的

            //補足
            char str[3][7] = {
                "ABC", "DEFGHI", "JK"
            };

        <VB系> ... 最大60次元までサポート
            ' 整数型配列(添字範囲 0?9 の10要素)
            Dim xxx(9) As Integer
            ' 整数型2次元配列(添字範囲 0,0?9,9 の100要素)
            Dim xxx(9, 9)
                 行~~  ~~列 .... として使用するのが一般的

        [補足]
            int xxx[10];
                : ... [statements]
            x = xxx[2]; // この2つの代入は等価です ... 通常はこちら
            x = 2[xxx]; //          〃

    動的配列
        <C系>
        <VB系>
            Dim xxx() As String ' 文字型
    不完全型
        <C系>
            void xxx;
        <VB系>
            Dim xxx As Variant  ' バリアント型(Variantは省略可能)

    ユーザ定義型
        <VB系>
            Dim xxx As XXX      ' ユーザー定義型(XXXは任意)
    その他
        <VB系>    'lengthは任意の数字
            Dim xxx As Boolean          ' ブール型
            Dim xxx As Currency         ' 通貨型
            Dim xxx As Date             ' 日付型
            Dim xxx As String           ' 可変長文字列型
            Dim xxx As String * [length]' 固定長文字列型
            Dim xxx As Object           ' オブジェクト型

    C言語におけるtypedefの置き換え分

        <C系>
            BYTE xxx;
        <VB系>
            xxx As Byte

        <C系>
            WORD xxx;
        <VB系>
            xxx As Integer

        <C系>
            DWORD xxx;
        <VB系>
            xxx As Long

制御文

    判断
        <C系>
            if (10 == xxx)              // 10の場合処理する
            {
                [statements]
            }
        <VB系>
            If 10 = xxx Then            ' 10の場合処理する
                [statements]
            End If

    多方向分岐
        <C系>
            switch (xxx)
            {
            case 1:
                [statements]
                break;
            case 2:
                [statements]
                break;
            default:
                [statements]
                break;
            }
        <VB系>
            Select Case xxx
            Case 1
                [statements]
            Case 2
                [statements]
            Case 3,5                ' 3と5の場合
                [statements]
            Case 6 To 9             ' 6から9の場合
                [statements]
            Case Else               ' 上記以外
                [statements]
            End Select

            Select Case xxx
            Case Is > 9             ' 9より大きい場合
                [statements]
            Case Is < 2             ' 2より小さい場合
                [statements]
            Case > 4 And xxx < 7  ' 4より大きくかつ7より小さい場合(5,6)
                [statements]
            Case Else               ' 上記以外
                [statements]
            End Select

    無判定反復
        <C系>
            for (; ; )                  // 無間ループ
            {
                if (10 == xxx)          // 10の場合ループを抜ける
                {
                    break;
                }
            }
        <VB系>
            Do                          ' 無間ループ
                If 10 = xxx Then        ' 10の場合ループを抜ける
                    Exit Do
                End If
            Loop

    前判定反復
        <C系>
            while(10 == xxx)            // 10の場合ループ
            {
                [statements]
            }
        <VB系>
            Do While 10 = xxx           ' 10の場合ループ
                [statements]
            Loop

            Do Until 10 = xxx           ' 10になるまでループ
                [statements]
            Loop

    後判定反復
        <C系>
            do
            {
                [statements]
            }
            while(10 == xxx)            // 10の場合ループ
        <VB系>
            Do
                [statements]
            Loop While 10 = xxx         ' 10の場合ループ

            Do
                [statements]
            Loop Until 10 = xxx         ' 10になるまでループ

    所定回反復
        <C系>
            for (xxx = 0; xxx < 10; xxx ++)
            {                           // 0?10未満(9)まで10回ループ
                [statements]
            }
        <VB系>
            'Nextに付属する xxx は変数の参照を明示的に表すものと考えて良い
            For xxx = 0 To 9 Step 1     ' 0?10未満(9)まで10回ループ
                [statements]
            Next xxx

            '上と同等の処理(Stepを省略すると、xxxはインクリメントされる)
            For xxx = 0 To 9            ' 0?10未満(9)まで10回ループ
                [statements]
            Next

    要素数回反復
        <C系>
            無し
        <VB系>
            Dim xxx                     ' バリアント型である事
            Dim work(9) As Integer      ' ワーク配列
            work(0) = 1                 ' 適当な初期値
            work(5) = 2                 '     〃
            work(9) = 3                 '     〃
            For Each xxx In work        ' 要素数回ループ
                ' xxx中にyyy(ループ回数)の値が代入されているのでそれを評価する
                Select Case xxx
                    Case 1
                        MsgBox "Start"
                    Case 2
                        MsgBox "Continue"
                    Case 3
                        MsgBox "End"
                End Select
            Next

    オブジェクト数回反復
        <C系>
            無し
        <VB系>
            "Each"をキーにして、VBヘルプを参照してください。

API
        http://msdn.microsoft.com/library/default.asp を
        参照すると引数のIN/OUTが分かります。
        <C系>
            // [HELPより] LPDWORD
            // Pointer to a DWORD.
            // [HELPより] DWORD
            // 32 ビットの符号なし整数、またはセグメント アドレスと
            // それに関連するオフセット。
            // [HELPより] LPCSTR
            // 上書き禁止文字列ポインタ用である点以外は、LPSTR と同じです。
            // (const char FAR*) として定義されます。
            WINADVAPI BOOL WINAPI xxx(
                  LPDWORD p1
                , DWORD p2
                , LPCSTR p3
                , LPBOOL p4
            );
        <VB系> ... 引数がINの場合は、ByValを付ける
            '  [HELPより] ByVal 引数の値渡し
            '  プロシージャの引数として変数を値による引き渡し(値渡し)
            '  で渡すと、渡された変数のコピーが作成されて、プロシージャ
            '  に渡されます。
            '  渡された変数の値がプロシージャ内で変更されても、その変更
            '  はコピーのみに影響し、元の変数には影響しません。
            '  変数を値渡しで渡すには、ByVal キーワードを使います。
            Declare Function xxx(
                , p1 As Long _
                , ByVal p2 As Long _
                , ByVal p3 As String _
                , p4 As Long _
            ) As Long

        列挙型を引数に使用している場合
        <C系>
            enum EEE
            {
                eee1 = 0x01,
                eee2 = 0x02,
                eee3 = 0x04,
                eee4 = 0x08
            };
            WINADVAPI BOOL WINAPI xxx(XXX p1);
        <VB系>
            Enum XXX
                eee1 = &H1
                eee2 = &H2
                eee3 = &H4
                eee4 = &H8
            End Enum
            Declare Function xxx(ByVal p1 As EEE) As Long

        セキュリティー記述子
        <C系>
            //PVOID Pointer to any type.
            typedef PVOID PSECURITY_DESCRIPTOR;
            WINADVAPI BOOL WINAPI xxx(PSECURITY_DESCRIPTOR p1, PSID *p2);
        <VB系>
            'PVOIDは、ByValを使用する
            Declare Function xxx(ByVal p1 As Long, p2 As Long) As Long

        ACL(access-control list)情報
        <C系>
            typedef struct _ACL {
                BYTE  AclRevision;
                BYTE  Sbz1;
                WORD  AclSize;
                WORD  AceCount;
                WORD  Sbz2;
            } ACL;
            typedef ACL *PACL;
            WINADVAPI BOOL WINAPI xxx(PACL p1);
        <VB系>
            'PACLは、ByValを使用する
            Declare Function xxx(ByVal p1 As Long) As Long

メモリ
        APIを使用(推奨)
        <C系>
            workPtr = GlobalAlloc(GMEM_FIXED, 1000);
        <VB系>
            Public Const GMEM_FIXED = &H0   ' 固定メモリ確保
            Dim workPtr As Long
            workPtr = GlobalAlloc(GMEM_FIXED, 1000)

        ReDimでも可能
        <C系>
            workPtr = GlobalAlloc(GMEM_FIXED, 1000);
        <VB系>
            Dim workPtr() As Byte
            ReDim workPtr(1000) As Byte
PR