[No.145 固定値や基準値はConst宣言を使用して変更し易くする]
[No.146 センス・発想力?TimeAddって関数を予想する力?]
[No.147 テーブルをつなげないクエリーとクロス集計クエリー]
[No.148 IE ラジオボタン(RADIO)の.Checkedと.Clickの違い]
[No.149 VBAでFTP.EXEを使い、ファイルをアップロードしてみる]
www.ken3.org(サイト内)から Google を利用して、

三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー] [VBA系 TOP] [三流君 TOP]



No.145 2003/10/06
固定値や基準値はConst宣言を使用して変更し易くする
[ページTOPへ戻る]

<固定値や基準値はConst宣言を使用して変更し易くする>

こんにちは、三流プログラマーのKen3です。 今回は、 Const宣言、固定値の宣言はどんな時使うと効果あるか? について、軽く書いてみたいと思います。

/* * 1. 今回のキッカケ */

読者よりメルマガの返信メールで、 Constぐらい使ったら? とメールをいただいたので、ネタにして書いてみたいと思います。 ※ホントは、もっと激しい文体でクレームをもらったんだけど

/* * 2.例題の概要説明 */

No.130 Access クエリーをExcelシートへ10行x3列で出力する http://www.ken3.org/backno/backno_vba27.html#130 クエリーで集計した結果をExcelのシートへ出力してみました。 出力時、10行x3列を1ブロックとして、出力してみました。 No.138 AccessからExcel出力、色・列幅・行の高さを調整する http://www.ken3.org/backno/backno_vba28.html#138 色や列幅、高さを変える方法を上記で探りました、 クエリーを10行x3列で出力して、 列幅・行の高さを変更してました。
Private Sub btnMakeExcel_Click()
    Dim rs As New ADODB.Recordset  'ADOのレコードセット
    Dim objEXCEL As Object  'Excel参照用
    Dim nYLINE   As Integer '行セット位置
    Dim nXLINE   As Integer '列セット位置
    Dim nRCNT    As Integer 'レコードカウンタ
    Dim strWORK  As String  'ワーク変数

    'Excelを起動する、オブジェクトの作成
    Set objEXCEL = CreateObject("Excel.Application") 'オブジェクトの作成
    objEXCEL.Visible = True  'Excelを見えるようにする
    
    '新規のブックを追加する
    objEXCEL.Workbooks.Add   'Excelのブックを作成

    'Excelのシートを追加、シート名を変更する
    objEXCEL.Sheets.Add  'シートを追加する
    objEXCEL.ActiveSheet.Name = "DATA"  'シート名をDATAにする
    
    '列幅は、縦なので、ここ、頭で定義する
    For nXLINE = 1 To 9 Step 3
        objEXCEL.Columns(nXLINE).ColumnWidth = 8.5
        objEXCEL.Columns(nXLINE + 1).ColumnWidth = 8.5
        objEXCEL.Columns(nXLINE + 2).ColumnWidth = 1.8
    Next nXLINE

    'レコードセットを開く(Q_YUBIN_5)
    rs.Open "Q_YUBIN5", CurrentProject.Connection, _
                    adOpenKeyset, adLockOptimistic

    'カウンタの初期化 スタート位置のセット
    nYLINE = 1 '1行目だよ
    nXLINE = 1 '1列目(A列)だよ
    
    '見出しをセットする
    objEXCEL.Cells(nYLINE, nXLINE) = "郵便番号"
    objEXCEL.Cells(nYLINE, nXLINE + 1) = "件数"
    '罫線を引く(見出しの位置から+10行分)
    Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _
                                    objEXCEL.Cells(nYLINE + 10, nXLINE + 1)))
    '行の高さを調整する
    objEXCEL.Rows(nYLINE).RowHeight = 25 '見出しの高さを25へ
    strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + 10) '10行分の範囲文字列
    objEXCEL.Rows(strWORK).RowHeight = 16 'データ高さを16へ

    nYLINE = nYLINE + 1 '見出し分行数が増えます
    nRCNT = 1  '見出し表示後は1レコード目だよ
    
    'レコードセットからExcelへデータをセットする
    'ループ処理
    While rs.EOF = False  'いつものEOFが偽の間
        'データをセットする(Accessから転記)
        objEXCEL.Cells(nYLINE, nXLINE) = rs("変換後郵便番号").Value
        objEXCEL.Cells(nYLINE, nXLINE + 1) = rs("変換後郵便番号のカウント").Value
        'セルの色を変える
        objEXCEL.Cells(nYLINE, nXLINE).Interior.ColorIndex = 33 'スカイブルー
        objEXCEL.Cells(nYLINE, nXLINE + 1).Interior.ColorIndex = 33
        '次を読む And カウンタを移動する
        rs.MoveNext  '次のレコードに移動しないと、とんでもないことに(笑)
        nRCNT = nRCNT + 1   '処理レコード数を増やす
        If nRCNT > 10 Then  '処理したレコードが10を越えた(次の列)
            nXLINE = nXLINE + 3  '次の列へカウンタを移動
            If nXLINE > 9 Then '列が越えた?
                nXLINE = 1  '1列目(A列)に戻す
                nYLINE = nYLINE + 2  '空白行にしたいのでセット位置を+2する
            Else
                nYLINE = nYLINE - 10 '列が変わったので行カウンタをマイナスする
            End If
            
            '見出しの表示
            objEXCEL.Cells(nYLINE, nXLINE) = "郵便番号"
            objEXCEL.Cells(nYLINE, nXLINE + 1) = "件数"
            '罫線を引く(見出しの位置から+10行分)
            Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _
                                      objEXCEL.Cells(nYLINE + 10, nXLINE + 1)))
            '行の高さを調整する
            objEXCEL.Rows(nYLINE).RowHeight = 25 '見出しの高さを25へ
            strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + 10) '範囲文字列を作成
            objEXCEL.Rows(strWORK).RowHeight = 16 'データ高さを16へ
            
            nYLINE = nYLINE + 1 '見出し表示分行数が増えます
            nRCNT = 1  '見出し表示後は1レコード目だよ
        Else  '
            nYLINE = nYLINE + 1  '次の行へセット位置を移動
        End If
    Wend
    '通常は、ここでExcelを保存するんだけど、今回は開きっぱなしの手抜き

    rs.Close   '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑)
    Set rs = Nothing  '変数も後始末しますか。使った器はキレイにしろって?

End Sub

/* * 3.もし、列幅変更の依頼が来たら? */

列幅の設定は、 ^^^^^^^^^^^^^^ 郵便番号 件数 空白を 8.5 8.5 1.8 とするために、 objEXCEL.Columns(nXLINE).ColumnWidth = 8.5 objEXCEL.Columns(nXLINE + 1).ColumnWidth = 8.5 objEXCEL.Columns(nXLINE + 2).ColumnWidth = 1.8 でセットしてます。 行の高さの設定は、 ^^^~~^^^^^^^^^^^ 見出しの行を25 データ行を16とするために、 '行の高さを調整する objEXCEL.Rows(nYLINE).RowHeight = 25 '見出しの高さを25へ strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + 10) '範囲文字列を作成 objEXCEL.Rows(strWORK).RowHeight = 16 'データ高さを16へ で、セットしました。 よし完成、なんて思っていたら、 客先担当者より、列幅と行の高さをもう少し広げてください。 幅が詰まっていないほうが見易いので なんて言われたら。 簡単なのは、幅8.5や高さ25など、数値を間違えないで変更すればOKかなぁ。 短いプログラムでも、高さの設定ヶ所は2ヶ所あるので慎重に直してね。 よし、修正終了。これでどうだ。 数日後、 非常に言いにくいんですけど、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ やっぱり元に戻してもらえませんか? 前のほうがいいともう一人の上司が言うもんで。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ なんてことがシステム作りの世界ではよくある話なので、 固定の数値を使わないで、Constでワンクッション置いて使うといいんですよ。 使い方は簡単で、 ^^^^^^^^^^^^^^^ 数値の設定を洗い出して、変数名を決めて、 Const 変数名 = 99.9 と定義します。 こんな感じで、頭に定義してみました。 漢字の変数名はよくないけど、テストなので許してね。。。
Private Sub btnMakeExcel_Click()
    '定数
    '列の幅を定義
    Const 列幅_郵便番号 = 9.5
    Const 列幅_件数 = 8.5
    Const 列幅_空白 = 1.75
    '行の高さを定義
    Const 高さ_見出し = 26
    Const 高さ_データ = 14
    
    Dim rs As New ADODB.Recordset  'ADOのレコードセット
    Dim objEXCEL As Object  'Excel参照用
    Dim nYLINE   As Integer '行セット位置
    Dim nXLINE   As Integer '列セット位置
    Dim nRCNT    As Integer 'レコードカウンタ
    Dim strWORK  As String  'ワーク変数

    'Excelを起動する、オブジェクトの作成
    Set objEXCEL = CreateObject("Excel.Application") 'オブジェクトの作成
    objEXCEL.Visible = True  'Excelを見えるようにする
    
    '新規のブックを追加する
    objEXCEL.Workbooks.Add   'Excelのブックを作成

    'Excelのシートを追加、シート名を変更する
    objEXCEL.Sheets.Add  'シートを追加する
    objEXCEL.ActiveSheet.Name = "DATA"  'シート名をDATAにする
    
    '列幅は、縦なので、ここ、頭で定義する
    For nXLINE = 1 To 9 Step 3
        objEXCEL.Columns(nXLINE).ColumnWidth = 列幅_郵便番号
        objEXCEL.Columns(nXLINE + 1).ColumnWidth = 列幅_件数
        objEXCEL.Columns(nXLINE + 2).ColumnWidth = 列幅_空白
    Next nXLINE

    'レコードセットを開く(Q_YUBIN_5)
    rs.Open "Q_YUBIN5", CurrentProject.Connection, _
                    adOpenKeyset, adLockOptimistic

    'カウンタの初期化 スタート位置のセット
    nYLINE = 1 '1行目だよ
    nXLINE = 1 '1列目(A列)だよ
    
    '見出しをセットする
    objEXCEL.Cells(nYLINE, nXLINE) = "郵便番号"
    objEXCEL.Cells(nYLINE, nXLINE + 1) = "件数"
    '罫線を引く(見出しの位置から+10行分)
    Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _
                                    objEXCEL.Cells(nYLINE + 10, nXLINE + 1)))
    '行の高さを調整する
    objEXCEL.Rows(nYLINE).RowHeight = 高さ_見出し '見出しの高さを設定
    strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + 10) '10行分範囲文字列を作成
    objEXCEL.Rows(strWORK).RowHeight = 高さ_データ 'データ高さを設定

    nYLINE = nYLINE + 1 '見出し分行数が増えます
    nRCNT = 1  '見出し表示後は1レコード目だよ
    
    'レコードセットからExcelへデータをセットする
    'ループ処理
    While rs.EOF = False  'いつものEOFが偽の間
        'データをセットする(Accessから転記)
        objEXCEL.Cells(nYLINE, nXLINE) = rs("変換後郵便番号").Value
        objEXCEL.Cells(nYLINE, nXLINE + 1) = rs("変換後郵便番号のカウント").Value
        'セルの色を変える
        objEXCEL.Cells(nYLINE, nXLINE).Interior.ColorIndex = 33 'スカイブルーをセット
        objEXCEL.Cells(nYLINE, nXLINE + 1).Interior.ColorIndex = 33
        '次を読む And カウンタを移動する
        rs.MoveNext  '次のレコードに移動しないと、とんでもないことに(笑)
        nRCNT = nRCNT + 1   '処理レコード数を増やす
        If nRCNT > 10 Then  '処理したレコードが10を越えた(次の列)
            nXLINE = nXLINE + 3  '次の列へカウンタを移動
            If nXLINE > 9 Then '列が越えた?
                nXLINE = 1  '1列目(A列)に戻す
                nYLINE = nYLINE + 2  '空白行にしたいのでセット位置を+2する
            Else
                nYLINE = nYLINE - 10 '列が変わったので行カウンタをマイナスする
            End If
            
            '見出しの表示
            objEXCEL.Cells(nYLINE, nXLINE) = "郵便番号"
            objEXCEL.Cells(nYLINE, nXLINE + 1) = "件数"
            '罫線を引く(見出しの位置から+10行分)
            Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _
                                      objEXCEL.Cells(nYLINE + 10, nXLINE + 1)))
            '行の高さを調整する
            objEXCEL.Rows(nYLINE).RowHeight = 高さ_見出し '見出しの高さを設定
            strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + 10) '10行分範囲文字列を作成
            objEXCEL.Rows(strWORK).RowHeight = 高さ_データ 'データ高さを設定
            
            nYLINE = nYLINE + 1 '見出し表示分行数が増えます
            nRCNT = 1  '見出し表示後は1レコード目だよ
        Else  '
            nYLINE = nYLINE + 1  '次の行へセット位置を移動
        End If
    Wend
    '通常は、ここでExcelを保存するんだけど、今回は開きっぱなしの手抜き

    rs.Close   '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑)
    Set rs = Nothing  '変数も後始末しますか。使った器はキレイにしろって?

End Sub

/* * 4.列数、行数の基準値もできれば定数で宣言しておく */

もし、客先から、列幅・行の高さの調整依頼が来ても、 頭で定義したConst定数を変更すれば、すぐに対応可能となりました。 めでたし、めでたし。 で、終わらないのがシステム開発ですよね。 ?????なぜ? 仕様は、10行3列の扱いだったのに、 少し短いから、12行X4列にしてくれとまたまた、依頼が来ました。 システム担当会社:チッ仕方ないなぁ。(仕様変更だよ、追加料金よこせよ) 客先担当:なんとかならないですかねぇ(少々の変更、出来るだろカネカネうるさい) なんて、険悪な場面もありつつ、 えっと、関係する部分は、 '罫線を引く(見出しの位置から+10行分) Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _ objEXCEL.Cells(nYLINE + 10, nXLINE + 1))) ↑罫線の範囲の計算だろ、 strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + 10) '10行分範囲文字列を作成↑行範囲でしょ 改行の判断と、列数の判断だよね・・・ If nRCNT > 10 Then '処理したレコードが10を越えた(次の列) nXLINE = nXLINE + 3 '次の列へカウンタを移動 If nXLINE > 9 Then '列が越えた? nXLINE = 1 '1列目(A列)に戻す nYLINE = nYLINE + 2 '空白行にしたいのでセット位置を+2する Else nYLINE = nYLINE - 10 '列が変わったので行カウンタをマイナスする End If 10って数字が10行だから、これを12行にして、 9列ってのが(項目数が2+空白1)x3列を越えたらって意味だから、 9列を12列にして nXLINE = nXLINE + 3 '次の列へカウンタを移動 この+3は、そのままでいいだろ・・・ ※3を無条件に4にすると思って変更すると、バグが発生する(笑) nYLINE = nYLINE - 10 '列が変わったので行カウンタをマイナスする これは、12行になったんだから、-12にへんこうして・・・ なんて感じで、自分が作っているのに、大変な変更になってしまう。 置き換え忘れたり、変えなくていい数値を変更してしまったり・・・・ 一見、見難くなるけど、基準値も定数にしておくと、 アトアトの変更でミスなくすばやく変更できます。 行を6行、列を4列と小さく変更が来たと仮定して、 定数を使って、Const MAX_行 = 6, Const MAX_列 = 4で組んでみます。 少し難しいのは、 For nXLINE = 1 To (MAX_列 * 3) Step 3 と、(MAX_列 * 3)で列の終わりの判断をしてます。 この3は、郵便番号+件数+空白で1つのブロックで3列使っている3です。 ※これも、変更したり、フィールドの項目数で可変になると、  完璧だけど、今回は、行と列の定数化だけで我慢してね。
Private Sub btnMakeExcel_Click()
    '定数
    '列の幅を定義
    Const 列幅_郵便番号 = 9.5
    Const 列幅_件数 = 8.5
    Const 列幅_空白 = 1.75
    '行の高さを定義
    Const 高さ_見出し = 26
    Const 高さ_データ = 14
    '行、列の基準値を設定する
    Const MAX_行 = 6  'で次の列へ
    Const MAX_列 = 4  'で次の段落へ
    
    Dim rs As New ADODB.Recordset  'ADOのレコードセット
    Dim objEXCEL As Object  'Excel参照用
    Dim nYLINE   As Integer '行セット位置
    Dim nXLINE   As Integer '列セット位置
    Dim nRCNT    As Integer 'レコードカウンタ
    Dim strWORK  As String  'ワーク変数

    'Excelを起動する、オブジェクトの作成
    Set objEXCEL = CreateObject("Excel.Application") 'オブジェクトの作成
    objEXCEL.Visible = True  'Excelを見えるようにする
    
    '新規のブックを追加する
    objEXCEL.Workbooks.Add   'Excelのブックを作成

    'Excelのシートを追加、シート名を変更する
    objEXCEL.Sheets.Add  'シートを追加する
    objEXCEL.ActiveSheet.Name = "DATA"  'シート名をDATAにする
    
    '列幅は、縦なので、ここ、頭で定義する
    For nXLINE = 1 To (MAX_列 * 3) Step 3
        objEXCEL.Columns(nXLINE).ColumnWidth = 列幅_郵便番号
        objEXCEL.Columns(nXLINE + 1).ColumnWidth = 列幅_件数
        objEXCEL.Columns(nXLINE + 2).ColumnWidth = 列幅_空白
    Next nXLINE

    'レコードセットを開く(Q_YUBIN_5)
    rs.Open "Q_YUBIN5", CurrentProject.Connection, _
                    adOpenKeyset, adLockOptimistic

    'カウンタの初期化 スタート位置のセット
    nYLINE = 1 '1行目だよ
    nXLINE = 1 '1列目(A列)だよ
    
    '見出しをセットする
    objEXCEL.Cells(nYLINE, nXLINE) = "郵便番号"
    objEXCEL.Cells(nYLINE, nXLINE + 1) = "件数"
    '罫線を引く(見出しの位置から+MAX_行行分)
    Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _
                                    objEXCEL.Cells(nYLINE + MAX_行, nXLINE + 1)))
    '行の高さを調整する
    objEXCEL.Rows(nYLINE).RowHeight = 高さ_見出し '見出しの高さを設定
    strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + MAX_行) 'MAX_行範囲文字列を作成
    objEXCEL.Rows(strWORK).RowHeight = 高さ_データ 'データ高さを設定

    nYLINE = nYLINE + 1 '見出し分行数が増えます
    nRCNT = 1  '見出し表示後は1レコード目だよ
    
    'レコードセットからExcelへデータをセットする
    'ループ処理
    While rs.EOF = False  'いつものEOFが偽の間
        'データをセットする(Accessから転記)
        objEXCEL.Cells(nYLINE, nXLINE) = rs("変換後郵便番号").Value
        objEXCEL.Cells(nYLINE, nXLINE + 1) = rs("変換後郵便番号のカウント").Value
        'セルの色を変える
        objEXCEL.Cells(nYLINE, nXLINE).Interior.ColorIndex = 33 'スカイブルーをセット
        objEXCEL.Cells(nYLINE, nXLINE + 1).Interior.ColorIndex = 33
        '次を読む And カウンタを移動する
        rs.MoveNext  '次のレコードに移動しないと、とんでもないことに(笑)
        nRCNT = nRCNT + 1   '処理レコード数を増やす
        If nRCNT > MAX_行 Then  '処理したレコードがMAX_行を越えた(次の列)
            nXLINE = nXLINE + 3  '次の列へカウンタを移動
            If nXLINE > (MAX_列 * 3) Then '列が越えた?
                nXLINE = 1  '1列目(A列)に戻す
                nYLINE = nYLINE + 2  '空白行にしたいのでセット位置を+2する
            Else
                nYLINE = nYLINE - MAX_行 '列が変わったので行カウンタをマイナスする
            End If
            
            '見出しの表示
            objEXCEL.Cells(nYLINE, nXLINE) = "郵便番号"
            objEXCEL.Cells(nYLINE, nXLINE + 1) = "件数"
            '罫線を引く(見出しの位置から+MAX_行分)
            Call make_Border(objEXCEL.Range(objEXCEL.Cells(nYLINE, nXLINE), _
                                      objEXCEL.Cells(nYLINE + MAX_行, nXLINE + 1)))
            '行の高さを調整する
            objEXCEL.Rows(nYLINE).RowHeight = 高さ_見出し '見出しの高さを設定
            strWORK = Trim(nYLINE + 1) & ":" & Trim(nYLINE + MAX_行) 'MAX_行範囲文字列を作成
            objEXCEL.Rows(strWORK).RowHeight = 高さ_データ 'データ高さを設定
            
            nYLINE = nYLINE + 1 '見出し表示分行数が増えます
            nRCNT = 1  '見出し表示後は1レコード目だよ
        Else  '
            nYLINE = nYLINE + 1  '次の行へセット位置を移動
        End If
    Wend
    '通常は、ここでExcelを保存するんだけど、今回は開きっぱなしの手抜き

    rs.Close   '開いたら閉じろ、ドアを開けたら閉めるってしつけられたでしょ(笑)
    Set rs = Nothing  '変数も後始末しますか。使った器はキレイにしろって?

End Sub
-【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ~~~~~~~~~~~~~~~~ オレ様、私は、SE様だ、月給30万以上ボーナス100万を探すのもありだよ。 私にみたいにVBA少しできるぐらいだと仕事無いよ・・・ と軽く言われても匿名なら気にならないし(笑) 逆にこんな簡単な仕事で月給27万貰えるの?って会社もあるし、世の中イロイロ。 http://www.ken3.org/etc/500yen/job.html ------------------------------------------------------------------------ 

/* * 5.終わりの挨拶 */

今回は、Constの使い方、便利さの説明でした。 Constを使用すると、 変更に強い、修正ミスの無いプログラムを書くことが出来ます。 なんとなく、感覚はわかりましたか? この辺が(Constを使用するプログラムと直値を使うプログラム) 私みたいな三流プログラマー と 一言、アドバイスをくれた一流読者との違いなんですね。 In message "[VBAで楽しく No.141] - 箇条書きで必要部品を洗い出し単体テストする", >日光が斜めから射すので、まっすぐに伸びない? >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >植物の成長って、日光に向かって伸びるんですよね。 >太陽の光がナナメからだったら、ナナメに伸びる・・・ >(上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・) --- って、話じゃないですが、私の変なサンプル見て、ナナメに育たないように、、、、 ※プログラム作法ってのも、頭に入れて、作成してくださいね・・・・ 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba145.lzh にAccess2000版が保存されています。 ※定数の数値を変更して、便利さをテストしてみてください。 何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。

No.146 2003/10/08
センス・発想力?TimeAddって関数を予想する力?
[ページTOPへ戻る]

<センス・発想力?TimeAddって関数を予想する力?>

どうも、三流プログラマーのKen3です。 今回は、 センス・発想力・想像力?について、軽く書きたいと思います。 軽く読み流してね。 ※VBAにTimeAddって関数は無いので、注意してね(笑)

/* * 1.今回のキッカケ */

隣のASP系の掲示板で、 http://www.ken3.org/cgi-bin/bbs/asp/wforum.cgi ---- insert into 文 を ひとつで 3つのデータを格納しなければいけないのですよね。 いじって見てましたが、だめでした。 すいません。教えてください。... 本屋で手当たり次第立ち読みしたのですが、insert into の単文だけのしか見つけら れなくて。 こういうのも普通本に出てるものですか?それともすぐ発想が浮かんでこなくては だめなものなんでしょうか? う〜ん 今年卒業してプログラマを目指してる就職浪人なんですが、、 みんなプログラマはセンスと言っているのでちょっと不安になってきました、、、とほほ ---- と もらった質問で、 またまた、偉そうに、下記のように答えてました。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ INSERT INTO KANSOU (F_KUBUN, F_NO, F_MEMO) VALUES ('ASP', 0, 'TEST DATA') みたいに、フィールド名と入れる値をペアで複数書けば、OKだと思います。 1つの方法は、ペアで作らないといけないので、 カンマの処理方法が一工夫いるのかな。 単純にやると、 S1,S2,S3,と最後のカンマの処理がポイントかなぁ。 ※必ず前に付ける、後ろに付けるが出来ないので、  いろいろあるけど、自信ないけどサンプルを2つ書きます。 sINTO = "" '初期化 sVALUE = "" For i = 1 To 3 '3項目作成する   x = Cstr(i) sINTO = sINTO & "S" & x & "," sVALUE = sVALUE & "'" & Request.form("SS"+x) & "' ," Next '後ろのカンマを取りたいので、カンマ分取る sINTO = Left(sINTO, Len(sINTO) - 1) sVALUE = Left(sVALUE, Len(sVALUE) - 1) sSQL = "insert into Score(" & sINTO & ") values(" & sVALUE & ")" Set rst = db.Execute(sSQL) なんて感じで、a,b,c,として、最後のカンマを取るとか、 はじめに1番目の値を入れて置き、前カンマにするとか、 いろいろかなぁ。 sINTO = "S1" '初期化 sVALUE = "'" & Request.form("SS1") & "'" For i = 2 To 3 '2番目からループする   x = Cstr(i) 'カンマを前につけてから項目作成 sINTO = sINTO & ",S" & x sVALUE = sVALUE & ",'" & Request.form("SS"+x) & "'" Next sSQL = "insert into Score(" & sINTO & ") values(" & sVALUE & ")" Set rst = db.Execute(sSQL) > こういうのも普通本に出てるものですか?それともすぐ発想が浮かんでこなくては >だめなものなんでしょうか? なれの問題だと思うけど。 目標の処理は1つだけど、書き方が1つじゃないので、 いろいろと迷うんだけど。 > う〜ん 今年卒業してプログラマを目指してる就職浪人なんですが、、 > みんなプログラマはセンスと言っているのでちょっと不安になってきました、、、とほほ センスかぁ、私も無いほうだからなんとも言えないけど、 センスがあると自分自身思っているまわりよりできる人は、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ プログラムはセンスだ、オレにはアルと言いたがるけど・・・・ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ナンバー1目指さなければ、センス無くてもそこそこは大丈夫だと思うけど。 上の世代(今現役のプログラマー)、下の世代(学生など) と競争しないといけないから、技術職は、大変なんだけど。 ヒラメキのセンスも重要だけど、それだけじゃないし。 なんて挫折した私が言うのも変だけど。 ^^^^^^^^^^^^^^ -------------- No.1にならなくてもいい〜〜なんて、どこかのヒット曲のフレーズじゃないんだから、 やっぱNo.1の勝ち組に入りたいよね・・・ 私のような負け組にならないように、で終わるとヒントにもならないので、 前に愚痴系のネタで想像力について書いてたので、そのまま発行します。 ※センスの表現って難しいんだけど、私がセンスを感じた質問でした。  (将来、この人は伸びるなぁと感じた質問だったので、愚痴系のネタにしてました) 発想力やセンスについて、何かの参考になるといいけど。 ※しつこいけど、努力型のプログラマーや作業者、私は好きだけどなぁ。  まぁ、ハヤイ話、遊んでいる天才ウサギと休まない努力のカメは、  祖母から聞いた昔話では  努力型のカメが勝つんだけど、世の中は、そんなに甘くないんだよね。  中には、遊ばない天才肌のウサギも現実に居るんだよね・・・差が埋まらないで開く  それはアナタの努力が足りないとは言わない、だって努力だけではダメなのも事実。  でも、それは今のままだったらって話、  何かのキッカケで自分自身も天才肌で遊ばないプログラマーになればいいって事。  皆さんは成長してくださいね。  挫折した三流プログラマーのメルマガが何かのキッカケとなればうれしいです。  (私も何かのキッカケを探しているけど、自分自身の才能は突然変異しなくって・・) 前置き長かったけど、拾い読みして参考となれば幸いです。

/* * 2.DateAdd関数を知っている人は笑うけど */

下記が、私に成長するなぁと感じさせた質問メールです。 ----- >時間の計算を行いたいのでTimeAddをヘルプで調べたのですが見つかりません。 >時間の計算方法をご教授下さい。(6時間後を計算したいのです) ----- と、相談をもらいました。 ※ご教授下さいの書き方は、キライなんだけど。 結論から書くと、 TimeAddってありそうな関数じゃなくて、 DateAddで時刻の計算が可能です。 ^^^^^^^
Sub aaa()

    Dim dtmTEST As Date '日付時刻型
    
    dtmTEST = Now()  '現在時刻の代入
    MsgBox "現在時刻は" & dtmTEST & "です"
    
    'DateAdd関数で6時間後を計算する
    dtmTEST = DateAdd("h", 6, dtmTEST)
    MsgBox "6時間後は" & dtmTEST & "です"

End Sub
As Dateって、DATE型と言ってますが、日付型で時刻も管理可能なんですね。 As Timeってのが、ありそうでないんですよ。 ^^^^^^^ で、日付の計算する関数、DateAddでhを指定して、 時刻も計算できたんですね。 dtmTEST = DateAdd("h", 6, dtmTEST) って感じで、6時間後を計算してます。 他にも、下記のような指定が可能です。 DateAdd(interval, number, date) yyyy yyyy q 四半期 m 月 y 年間通算日 d 日 w 週日 ww 週 h 時 n 分 s 秒 と、パラメータを与えると、イロイロと計算可能です。

/* * 3.質問者の一言にプログラマーとしての素質を感じる(感じた) */

DateAddだろ・・と笑った人も居るかもしれませんが、 私は、質問者の一言にプログラマーとしての素質を感じる(感じた)。 >時間の計算を行いたいのでTimeAddをヘルプで調べたのですが見つかりません。 これって、DateAdd関数を知っているから(DateAddで日付を計算したことあった?) TimeAddって関数もあるだろうと予想しての質問だと深読みしました。 DateAddで日付が計算可能なら、時刻はTimeAddだろう。 こんな感じの想像力もプログラマーとしては、必要だと思う。 ^^^^^^^^^^^^^^^^^^ 関数とは違うが、 Sheets.Addでシートの追加が出来ます。 これを覚えた人が居て、ワークシートの追加を新たにしたい時、 Workbooks.Addと同じメソッドが使えるのでは? ※同じ.Addメソッドを持っているのでは? なんて感じで、予想できる力、想像力ってあると思う。 一歩一歩進む努力家もありだけど、ひらめき勝負もありかなぁ。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 4.自分が探しきれないのには、どこが原因なのか? */

第一印象が良くて、質問者をいいプログラマーさんだ。将来伸びる・有望。 素質あるよ、と一部を見て思ってしまったが、ホントにそうなのか? (一度、かわいい子、できる子と思うそんな先入観が邪魔をする?) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ いつもの、逆の角度、立場から考えてみると、 実は、できる人って(できるプログラマーって)、 未知の関数など、調べ方がうまいんだよね。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ※逆を書くと私はヘタなので三流かなぁ。 先輩や掲示板で質問すると、回答を簡単にもらうんだけど、 自分が探しきれないのには、どこが原因なのか? なぜ先輩は知っていた、掲示板の回答者の常連さんはどこから情報を仕入れている? を考えると、今後の参考になると思う。 具体的に書くと、掲示板やML、三流作者に直接メールしたのは? ・会社に親切な出来る先輩が居ないので、ネットに頼った。 ・資料が会社に無いので探せなかった なんて、オレ様は優秀だけど先輩や職場環境が悪い、自分は悪くないパターンと、 自分が見れる資料があるのに探せなかった ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ・ヘルプを見たが探せなかった ・検索のキーワードが思いつかなかった なんてパターンがあるのかなぁ。 その原因を自己分析して、次回の作業に活かす。 そんな繰り返しで、独り立ちできる一人前のプログラマーになっていくのかなぁ。 いつも先輩やMLなどで、ヘルプを見ろと言われている人は、 先輩や回答者が偉そうってのもあるんだけど、 成長して調べ方を学ぶといいかも。 ~~~~~~~~~~~~~~~~~~~~ イヤ、職場環境だ、オレ様の実力を出し切れる会社、育ててくれる会社を探したい人は 下記も参考にしてみてね。 -【けんぞう!】--------------------------------------------------------- 転職関係、在宅プログラマー、SOHOの広告まとめました http://www.ken3.org/etc/500yen/zaitaku.html いろいろとあるので転機の人はぜひ 登録料無料、匿名で探せるので在宅で小金稼ぎの人も見てね ~~~~~~~~~~~~~~~~ オレ様、私は、SE様だ、月給30万以上ボーナス100万を探すのもありだよ。 私にみたいにVBA少しできるぐらいだと仕事無いよ・・・ と軽く言われても匿名なら気にならないし(笑) 逆にこんな簡単な仕事で月給27万貰えるの?って会社もあるし、世の中イロイロ。 http://www.ken3.org/etc/500yen/job.html ------------------------------------------------------------------------ 

/* * 5.終わりの挨拶 */

今回は、 aspの掲示板の話と、 TimeAddは無くてDateAddですよのQAから、 勝手に話を広げてみました。 関数や事例紹介もいいけど、 資料の調べ方もメルマガの必要なネタかもしれませんね・・・ 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ) In message "[VBAで楽しく No.141] - 箇条書きで必要部品を洗い出し単体テストする", >日光が斜めから射すので、まっすぐに伸びない? >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >植物の成長って、日光に向かって伸びるんですよね。 >太陽の光がナナメからだったら、ナナメに伸びる・・・ >(上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・) --- って、話じゃないですが、私の変なサンプル見て、ナナメに育たないように、、、、 ※調べ方やプログラム作法ってのも、頭に入れて、作成してくださいね・・・・

No.147 2003/10/12
テーブルをつなげないクエリーとクロス集計クエリー
[ページTOPへ戻る]

<テーブルをつなげないクエリーとクロス集計クエリー>

どうも、三流プログラマーのKen3です。 今回は、 テーブルをつなげないクエリー と クロス集計クエリー を使用して、小細工をしてみたいと思います。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba147.lzh にdb147.mdb(Access2000版)が保存されています。 ※クエリーやデータをいじって、遊んでみてください。 ※あまり、お薦め出来ないけど、こんな方法もあるんだってことで。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に来た質問です。 ---- 以下のようなテーブルを クエリーで横方向に展開することは出来るのでしょうしょうか? 何かいい方法があれば教えてください! よろしくお願いします。 商品 支払年月 支払回数 月額 1 商品A 200303 5 3000 2 商品B 200305 2 2000 3 商品C 200303 12 1000 ↓ 商品 200303 200304 200305 200306 200307 200308〜200402 1 商品A 3000 3000 3000 3000 3000 2 商品B 2000 2000 3 商品C 1000 1000 1000 1000 1000 1000 〜1000 -------------------------------------------------------- と もらった質問で少し考えてみました。

/* * 2.クロス集計クエリーを使いたいけど、レコードが足りない・・・ */

一番先に頭に思い浮かぶもの、 Excelだったら、分析系のピボットテーブルで行と列指定、 Accessだと、あまり使ったこと無いけどクロス集計クエリーってのがあったなぁ。 あっ、でも、 商品 支払年月 支払回数 月額 1 商品A 200303 5 3000 の1レコードから、 商品 200303 200304 200305 200306 200307 200308〜200402 1 商品A 3000 3000 3000 3000 3000 と 5つの項目は作れないか。 レコードの作りが、 商品 支払年月 月額 商品A 200303 3000 商品A 200304 3000 商品A 200305 3000 商品A 200306 3000 商品A 200307 3000 ってなっていれば、行を商品、列を支払年月のクロス集計でいいんだけど。 ワークテーブル作って、支払回数分、レコードを発生させるかな・・・ ^^^^^^^^^^^^^^^^^^^^ それが王道の処理なんだろうけど、 今回も小細工してやるぞ〜と、三流君の悪い癖が・・・ ※参考程度にしてね。

/* * 3.問題なのは、レコードが足りないってことなので、強引に増やす */

問題は、はっきりしてるんだよね。 支払回数分レコードがあれば、クロス集計クエリーが使えるんだよねキット。 支払数分、レコードを増やすかぁ・・・う〜ん。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ まぁ、昔の人がよく言ってたり、偉そうな先輩が飲んだ時語っていると思うけど、 失敗を成功に生かす的な言葉で、 失敗は成功の元、会社によっては、失敗は成功の母とか言ってるよね。 Accessでクエリー作成していると、 2つのテーブルをつなげるリンクを忘れたりしないと思いますが、 もし、明細とマスターデータをつなげるのを忘れたら?どうなるでしょう? 隣のASPの例だけど、 http://www.ken3.org/cgi-bin/test/test073-1.asp でテストできる SQL From句にテストで2つのテーブルデータを指定(つなげない) を見ると、 Select * From T_月別売上, T_商品 と、条件無しのSQL文を発行してます。 すると、どうなるか? T_月別売上 が 8件 T_商品 が 6件 このデータ が 48件のレコードを返してきます。 T_月別売上の1件に対して、リンクしてないので商品6件分データが作成されます。 これって、明らかにミスなんだけど、今回は、そのミスを利用してみます。 ダミーのテーブルを1つ作成します。 テーブル名はDummyCnt フィールドはCNTと数値型でデータを作成して、 0〜データを入力します(0から連番で予想される最大支払回数まで作成する) ↑ダミーテーブル、データイメージ そのダミーテーブル と DATAテーブルをつなげない、 そんな欠陥クエリーを作成します。 クエリーを実行すると、DummyCntで作成したレコード数分同じデータが作成されます 商品 支払年月 支払回数 月額 CNT A1 200303 5 3000 0 A1 200303 5 3000 1 A1 200303 5 3000 2 ・ ・ A1 200303 5 3000 19 A1 200303 5 3000 20 B1 200305 4 5000 0 B1 200305 4 5000 1 とクエリーの結果が作成されます。 ※0〜20と21個のダミーデータを作成してます。 ↑ダミーテーブルとリンクしないとこんな感じです。 -【けんぞう!】--------------------------------------------------------- 月500円、タバコなら2箱、120円缶コーヒーなら4缶分の謝礼をGetするなら http://www.ken3.org/etc/500yen/ ←無料アンケート系の広告です。 『チッ、がんばって回答して月500円かよ』(お馬鹿なプログラマー:31歳) ------------------------------------------------------------------------

/* * 4.増えたデータを調整する */

商品 支払年月 支払回数 月額 CNT A1 200303 5 3000 0 A1 200303 5 3000 1 A1 200303 5 3000 2 こんな、欠陥データ作られても、困るんだよね。 固定でn件データが増えても使えないでしょ? ほしいイメージは、 ^^^^^^^^^^^^^^^^^^ 商品 支払年月 支払回数 月額 商品A 200303 5 3000 だったら、 商品 支払年月 月額 商品A 200303 3000 商品A 200304 3000 商品A 200305 3000 商品A 200306 3000 商品A 200307 3000 の 5件なんだよ。 ~~~~ ですよね、 そこで、演算フィールドを作成して、それに近いデータを作ります。 ^^^^^^^^^^^^^^^^^^^^^^ まずは、200303,200304,200305,200306,200307と、月数を増やしたいので、 基準の200303の文字列を日付型にCdate変換してから、 DateAddでCNT月後を計算してみます。 支払中: DateAdd("m",[CNT],CDate(Left([支払年月],4) & "/" & Mid([支払年月],5,2) & "/01")) と、計算式を作成して、支払中フィールドを作成しました。 すると、 支払年月にCNTを+したフィールドが作成されます。 商品 支払年月 支払回数 月額 CNT 支払中 A1 200303 5 3000 0 2003/03/01 ←03月+CNTで3月 A1 200303 5 3000 1 2003/04/01 03月+CNTで4月 A1 200303 5 3000 2 2003/05/01 03月+CNTで5月 A1 200303 5 3000 3 2003/06/01 03月+CNTで6月 A1 200303 5 3000 4 2003/07/01 03月+CNTで7月(5回ここで終了したい) A1 200303 5 3000 5 2003/08/01 03月+CNTで8月(いらないのに) A1 200303 5 3000 6 2003/09/01 03月+CNTで9月(いらない) となり、1ヶ月単位でCNTの値を利用して変化させてます。 次は、支払回数が5回なら、5個のデータにして必要・不必要を区別したい。 ホントはレコードを増やさないのがベストだけど、 FLGとフラグ項目を作成して、CNTが支払回数以内ならON(支払い中)とフラグを付けます FLG: IIf([cnt]<[支払回数],"ON","") と、演算フィールドを作成しました。 商品 支払年月 支払回数 月額 CNT 支払中 FLG A1 200303 5 3000 0 2003/03/01 ON 03月+CNTで3月 A1 200303 5 3000 1 2003/04/01 ON 03月+CNTで4月 A1 200303 5 3000 2 2003/05/01 ON 03月+CNTで5月 A1 200303 5 3000 3 2003/06/01 ON 03月+CNTで6月 A1 200303 5 3000 4 2003/07/01 ON 03月+CNTで7月(5回終了) A1 200303 5 3000 5 2003/08/01 (""の空白) A1 200303 5 3000 6 2003/09/01 (""の空白) と、クエリーの結果データが作成されました ↑2つの演算フィールドを追加する

/* * 5.データがそろったので、クロス集計クエリーを作成する */

作成したクエリーのFLGがONのデータをクロス集計すれば、 目的のクエリーを作ることが出来そうです。 ※クエリーを2つ使ってしまいますが。 クエリーの種類をクロス集計クエリーにして、 行:商品 列:支払中(作成した演算フィールドを使用) 値:月額 where条件:FLG=ONのデータ で、作成すると、なんとかできそうです。 ↑作成イメージ -【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

/* * 6.終わりの挨拶 */

今回は、 つなげないクエリーでデータを増やし クロス集計クエリーを使用して、行列で集計したデータを作成してみました。 半ば強引に作成したので、データ量が多かったりすると、 集計に時間がかかったりするので、 判断しながら使ってみてください。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ)

No.148 2003/10/14
IE ラジオボタン(RADIO)の.Checkedと.Clickの違い
[ページTOPへ戻る]

<IE ラジオボタン(RADIO)の.Checkedと.Clickの違い>

どうも、三流プログラマーのKen3です。 今回は、 ラジオボタンを探ってみます。 今回の、サンプルファイルは、 http://www.ken3.org/vba/lzh/vba148.lzh にvba148.xls(Excel2000版)が保存されています。 ※自分でテストページを作ったりして、遊んでみてください。 関連項目、 VBAでInternetExplorer.Applicationを操作する(IE操作) http://www.ken3.org/cgi-bin/group/vba_ie.asp もヨロシクね。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に来た質問です。 ---- WebBrowserコントロールからラジオボタン選択がうまくできません。 Googleの先頭ページのラジオボタン選択は過去ログを拝見してうまくできました がうまくできないページがあります。その他のラジオボタン選択方法についてよ ろしければ教えて下さい。 ---- と もらった質問にいつものように、質問に質問で返し(オイオイ) ※出来るだけ、質問に質問で返さないように心がけてるんだけど・・・ ---- こんな質問返しをしてみたり --- できたら、うまく行かなかったページの HTMLのフォーム部分だけでもUPしてもらえると、 何かしらアドバイスできるかもしれません。 ----

/* * 2.問題のページのソースファイル */

http://www.ken3.org/vba/test148.html に質問者からのHTMLをUPしました。下記のような感じのHTML文です。 <HTML> <BODY BGCOLOR="#ffffff"> <TABLE BORDER=0 frame="border"> <TR> <TD> <DIV ALIGN=LEFT> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a1" tabindex="1" onClick="clickradio()" CHECKED><font size="3" color="#0066ff"><b>すみれ</b></font> </DIV> </TD> <TD> <DIV ALIGN=CENTER> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a2" tabindex="1" onClick="clickradio()" ><font size="3" color="#0066ff"><b>たんぽぽ</b></font> </DIV> </TD> <TD> <DIV ALIGN=RIGHT> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a3" tabindex="1" onClick="clickradio()" ><font size="3" color="#0066ff"><b>ひまわり</b></font> </DIV> </TD> <TD> <DIV ALIGN=RIGHT> <INPUT TYPE=RADIO NAME="sentaku" VALUE="a4" tabindex="1" onClick="clickradio()" ><font size="3" color="#0066ff"><b>チューリップ</b></font> </DIV> </TD> </TR> </TABLE> </BODY> </HTML> ぱっと見、フォーム?<FORM>使っていないのかなぁ?まぁいいや、 ^^^^^^^^^^^^^^^^^^^^^^^^^^

/* * 3..allから選択してみる */

_________________________ ---- 余談 ハマった話 ---- ~~~~~~~~~~~~~~~~~~~~~~~~~ INPUT type=radio Element | input type=radio Object http://msdn.microsoft.com/workshop/author/dhtml/reference/objects/input_radio.asp を見ると、ラジオボタンは、 .Checked = True / False なんですね。 objIE.document.all.memo.Value = strPARA '感想をセット と同様に objIE.document.all.kubun.Value = "VBA" としたら、ダメだった・・・ なので、ループで探して、 .Checked = True としてます。 ※意外とハマリマシタ(笑) なんて感じで、 ラジオボタンのプロパティは.Checked = True / False ですよ と 偉そうに、 No.144 IE PostData付でURLを開く(データをPostする) http://www.ken3.org/backno/backno_vba29.html#144 で、書いてました。 Form(0)のループでフォームの構成要素から下記のようにして探していました。 '区分を探してセットする For Each objITEM In objIE.document.Forms(0) 'フォームのオブジェクトでループ '名前がKUBUNで値がVBAのラジオボタンを探す If objITEM.Name = "KUBUN" And objITEM.Value = "VBA" Then objITEM.Checked = True 'セレクト状態をtrueにする End If Next 今回は、 フォームが無さそうなので、同様に.Allから探してみました。 ^^^^^^^^^^^^^^^^^^^^^^^^ Dim strRADIO(0 To 3) As String 'ラジオボタンの値 '変数の初期化 strRADIO(0) = "a1" 'すみれ strRADIO(1) = "a2" 'たんぽぽ strRADIO(2) = "a3" 'ひまわり strRADIO(3) = "a4" 'チューリップ '種類を選択してみる strWORK = InputBox("0すみれ 1たんぽぽ 2ひまわり 3チューリップ どれ?", , "0") nNO = Val(strWORK) If nNO < 0 Or nNO > 3 Then nNO = 0 '範囲外の時、番号を0にする End If なんて感じで、探したいa1〜a4を入力させ、 '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Checked = True 'セレクト状態をtrueにする End If Next とすると、見事にエラーが発生する。 オブジェクトはこのプロパティ・メソッドをサポートしてません ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ えっ?なんで? まぁ、文句言わないで、デバッグ押しますか。 If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then ここがエラーです。 う〜ん、なんだろうねぇ? プロパティがないのかぁ、.Nameにアクセスできないのか。 あっ、.Nameって<INPUT>のタグとか<FORM>とかの名前しかないのか。 試しにどのタグでこけたか見てみたかったので、 イミディエイト ウインドウで見てみると、 ? objitem.tagname HTML あらら、頭でエラーかよ。 たしかに<HTML>のタグは、.Nameを持っていないよね。 ※<HTML Name="AAAA">なんて無いよね・・・ ↑見せたくないエラーのイメージです(笑) とすると、 objITEM.Nameの前に、.TAGNameでINPUTのタグがチェックして、 それから、.Name = "sentaku" と.Value = strRADIO(nNO)をチェックしますか。 ※各タグによって、持っているプロパティが違うので、先にタグをチェックする '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.TAGName = "INPUT" Then 'まず、タグでINPUTか判断 Debug.Print objITEM.Name 'TESTで値を表示 Debug.Print objITEM.Value 'TESTで値を表示 If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Checked = True 'チェック状態をtrueにする End If End If Next ↑こんな感じで、.TAGName="INPUT"でチェック後に .Name .ValueへアクセスしているのでOKです。 'IEラジオボタンをチェック(.Checked=True)するサンプル
Sub TEST_RADIO_Checked()

    Dim strURL   As String
    Dim objIE    As Object
    Dim objITEM  As Object
    Dim strAAA   As String
    Dim nNO      As Integer '選択値を数値にしたいので
    Dim strWORK  As String  'ワーク変数
    Dim strRADIO(0 To 3) As String  'ラジオボタンの値

    '変数の初期化
    strRADIO(0) = "a1"  'すみれ
    strRADIO(1) = "a2"  'たんぽぽ
    strRADIO(2) = "a3"  'ひまわり
    strRADIO(3) = "a4"  'チューリップ

    '種類を選択してみる
    strWORK = InputBox("0すみれ 1たんぽぽ 2ひまわり 3チューリップ どれ?", , "0")
    nNO = Val(strWORK)
    If nNO < 0 Or nNO > 3 Then
        nNO = 0  '範囲外の時、番号を0にする
    End If

    'IEオブジェクトの作成
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    
    'テストの選択ページを開く
    strURL = "http://www.ken3.org/vba/test148.html"
    objIE.Navigate "" & strURL  'アドレスを渡し表示する

    '表示完了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
        'ただ待ってるのつまらないので、タイトルバーをイタズラ
        If strAAA <> Format(Now(), "SS") Then
            strAAA = Format(Now(), "SS") '現在の秒数を代入
            Application.Caption = Now() & "読み込み処理待ちです"
        End If
    Loop
    Application.Caption = "読み込みは終了"

    '区分を探してセットする
    For Each objITEM In objIE.document.all  '.allからオブジェクトを探す
        '名前がsentakuで値がa?のラジオボタンを探す
        If objITEM.TAGName = "INPUT" Then  'まず、タグでINPUTか判断
            Debug.Print objITEM.Name       'TESTで値を表示
            Debug.Print objITEM.Value      'TESTで値を表示
            If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then
                objITEM.Checked = True  'チェック状態をtrueにする
            End If
        End If
    Next

    '終了メッセージ
    MsgBox "データが選択されたか、確認してください"

End Sub

/* * 4.javascriptのクリックイベントが発生してないのでは? */

ふぅ〜、なんとか出来ましたね。 これでOKかなぁ。 だからアンタは三流って呼ばれるんだよキット。 えっ、だって、テストで選択できたよ、エラー発生したけど、 今回は、親切に、固定値じゃなくてINPUTBOXだけど違う選択できるし。 サンプル的には、手前味噌だけどおいしく出来ていると思うけど。 何かヤバイ空気を感じない?何年メルマガ書いてるの?何年人のプログラム見てるの? あっ、 <INPUT TYPE=RADIO NAME="sentaku" VALUE="a2" tabindex="1" onClick="clickradio()" の onClick="clickradio()" って何だ? 右脳と左脳の小芝居は、このくらいにして、 ~~~~~~~~~~~~~~~~~~~~ ラジオボタンの選択時イベントで、clickradio()って処理を呼んでますね。 確かに、ヤバイニオイがしますね。 下記のHTMLをAlatを確認の関数として、イベントの発生をチェックしてみます。 <script type="text/javascript"> <!-- function clickradio(){ // イベントのテスト alert("Hello イベント発生テスト"); } // --> </script> <noscript> <b>JavaScriptON</b>でテストしてください。 </noscript> を http://www.ken3.org/vba/test148.html にJavaScriptを追加して、テストしてみると、 ラジオボタンのチェックは変更されるが、イベントは発生していないみたいです。 ※手作業で、ラジオボタンを変更すると、メッセージが表示される。

/* * 5.素直にクリック(.Click)してみる */

危なかったね、発行後に気が付くと、質問者からできませんなんて再質問が来たね。 人の質問をひねくれて、深読みする、そんな腐った心だから気が付いたのかもね。 まぁまぁ、そんなこと言わないで、素直に行こうよ、素直に。 じゃ、素直な心で、.Clickとクリックメソッドにすればいいのかよ。 それで動くのかよコラ。 ~~~~~~~~~~~~~~~~ 誰に聞いてるの?マイクロソフトのサポートに? 別に壊れないんだし、素直に修正してやってみたら? テストで、 .Checked = True 'チェック状態をtrueにする のチェック状態のプロパティを変更する方法から、 .Clickのクリックメソッドを実行する方法に。 なんか悔しくてさ、 途中まで偉そうに、INPUTタグを探して.Checked = Trueってやってた自分にさ。 なんて、得意の小芝居は、置いといて、 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ データを探す処理までは同じように、行い、 見つけたオブジェクトに対して、.Clickしてみました。 '区分を探してセットする For Each objITEM In objIE.document.all '.allからオブジェクトを探す '名前がsentakuで値がa?のラジオボタンを探す If objITEM.TAGName = "INPUT" Then 'まず、タグでINPUTか判断 Debug.Print objITEM.Name 'TESTで値を表示 Debug.Print objITEM.Value 'TESTで値を表示 '↓の条件でクリックするオブジェクトを探す If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then objITEM.Click '素直にクリックしてみた(笑) Exit For '目的の処理が終わったので、ループを抜ける End If End If Next ついでに、.Click後、Exit Forで抜けました(その後、調べる必要ないので) 'IEラジオボタンをクリック(.Click)するサンプル
Sub TEST_RADIO_Click()

    Dim strURL   As String
    Dim objIE    As Object
    Dim objITEM  As Object
    Dim strAAA   As String
    Dim nNO      As Integer '選択値を数値にしたいので
    Dim strWORK  As String  'ワーク変数
    Dim strRADIO(0 To 3) As String  'ラジオボタンの値

    '変数の初期化
    strRADIO(0) = "a1"  'すみれ
    strRADIO(1) = "a2"  'たんぽぽ
    strRADIO(2) = "a3"  'ひまわり
    strRADIO(3) = "a4"  'チューリップ

    '種類を選択してみる
    strWORK = InputBox("0すみれ 1たんぽぽ 2ひまわり 3チューリップ どれ?", , "0")
    nNO = Val(strWORK)
    If nNO < 0 Or nNO > 3 Then
        nNO = 0  '範囲外の時、番号を0にする
    End If

    'IEオブジェクトの作成
    Set objIE = CreateObject("InternetExplorer.application")
    objIE.Visible = True
    
    'テストの選択ページを開く
    strURL = "http://www.ken3.org/vba/test148.html"
    objIE.Navigate "" & strURL  'アドレスを渡し表示する

    '表示完了まで待つ
    Do While objIE.Busy = True
        '何もしないループ(笑)
        DoEvents
        'ただ待ってるのつまらないので、タイトルバーをイタズラ
        If strAAA <> Format(Now(), "SS") Then
            strAAA = Format(Now(), "SS") '現在の秒数を代入
            Application.Caption = Now() & "読み込み処理待ちです"
        End If
    Loop
    Application.Caption = "読み込みは終了"

    '区分を探してセットする
    For Each objITEM In objIE.document.all  '.allからオブジェクトを探す
        '名前がsentakuで値がa?のラジオボタンを探す
        If objITEM.TAGName = "INPUT" Then  'まず、タグでINPUTか判断
            Debug.Print objITEM.Name       'TESTで値を表示
            Debug.Print objITEM.Value      'TESTで値を表示
            '↓の条件でクリックするオブジェクトを探す
            If objITEM.Name = "sentaku" And objITEM.Value = strRADIO(nNO) Then
                objITEM.Click  '素直にクリックしてみた(笑)
                Exit For       '目的の処理が終わったので、ループを抜ける
            End If
        End If
    Next

    '終了メッセージ
    MsgBox "データが選択されたか、確認してください"

End Sub
-【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

/* * 6.終わりの挨拶 */

今回は、小芝居がうざかったけど、 IEでラジオボタンの選択を .Checked = True で チェック状態をtrueにする と .Clickのクリックメソッドを実行する そんな2つの方法を行い、違いも少し書いてみました。 IEお嬢様、やはり強敵でしたね。 ^^^^^^^^ 小芝居してほしい、VBAの質問あったら、 メールや掲示板で気軽に書いてください。 何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 いつも失敗?の負け組のKen3でした。 ~~~~~~~(↑オイオイ) In message "[VBAで楽しく No.141] - 箇条書きで必要部品を洗い出し単体テストする", >日光が斜めから射すので、まっすぐに伸びない? >^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ >植物の成長って、日光に向かって伸びるんですよね。 >太陽の光がナナメからだったら、ナナメに伸びる・・・ >(上司や先輩の育て方や光具合が、新人の成長に影響を与えるのも事実です・・・) --- って、話じゃないですが、私の変なサンプル見て、ナナメに育たないように、、、、 ※調べ方やプログラム作法ってのも、頭に入れて、作成してくださいね・・・・

No.149 2003/10/24
VBAでFTP.EXEを使い、ファイルをアップロードしてみる
[ページTOPへ戻る]

<VBAでFTP.EXEを使い、ファイルをアップロードしてみる>

どうも、三流プログラマーのKen3です。 今回は、 コマンドプロンプトのFTPを使用して、 ファイルをアップロードしてみたいと思います。 関連項目、 VBAでFTP.EXEを使う http://www.ken3.org/cgi-bin/group/vba_ftp.asp もヨロシクね。

/* * 1.今回のキッカケ */

VBA系の掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に来た質問です。 ---- >エクセルVBAから、ファイルを自動でFTPしたいのですが、自分なりには >相当しらべてみたのですが、現時点での私の能力では・・・限界にきています。 >しかし、現在作りかけている子供用問題集において、自分の成績をWEBにアッ >プするために、どうしてもその機能がほしいのです。 >過去ログを読むことも、検索も、自分なりにがんばったのですが・・・どうかそ >の部分のプログラムを教えてください。 ---- と もらった質問にいつものように、質問に質問で返し(オイオイ) ※出来るだけ、質問に質問で返さないように心がけてるんだけど・・・ ---- こんな質問返しをしてみたり --- やりたいこと、仕様は ExcelのVBAで、 aaa.txt(ファイルは1つ?) を FTPで(FTP.EXE?それともフリーのDLL?)、 指定したディレクトリにUPする でいいのかなぁ? 私も詳しくないのですが、 WebにUPする、リアルタイム性が無いなら、 メールアドレスを1つ作って(成績回収用に専用で1つ) 回収するのが楽そうな気もするし、 FTPにこだわらないで、 WebにデータをPOSTして、回収するとか。 なんて代案もあるけど、 FTPで送信、少し、私も探ってみますね。 ---- ヤバイ・ヤバイ、、、掲示板のお偉い人達みたいに、 コッチのほうがいいよと質問者のやりたいことを否定して、 自分の好きな方法を強引に進めようとしてしまった・・・(少し反省) FTP.EXEの使用方法、まとめも兼ねて、作ってみますか。

/* * 2.処理の構想を考える */

Set objFTP = CreateObject("FTP.application") なんて感じの、スマートな方法、あればいいのですが、 チョット見つからなかったので、 パラメータファイルにFTPのコマンドを書き、 ftp.exe で実行、そんな感じの処理を作成してみたいと思います。 -- 参考バックナンバー -- No.25 コマンドラインのFTPを使ってみた http://www.ken3.org/backno/backno_vba06.html#25 'shellでFTPを起動 Shell "ftp -s:" & strPNAME と、Shellでftp.exeを起動して、-s のコマンドを実行させる、そんな構想でした。 No.26 FTP -n オプションとuserコマンド</A></h3> http://www.ken3.org/backno/backno_vba06.html#26 In message "-n と user 使えよバカ", s***@********.ne.jpさん wrote... >ここ見ろ-->http://www.zdnet.co.jp/help/tips/linux/l0462.html >-n と user 使えよバカ --- ftp -n とやると、ログインを聞いてこないので、 user ユーザ名 パスワード でログイン出来るんですね。

/* * 3.昔の復習を兼ねて、-n -sオプション */

http://www.ken3.org/backno/backno_vba06.html#26 で、作成したのが、下記のサンプルです。
Sub test()

    Dim strPNAME As String   'パラメーターファイル名
    Dim nFNO     As Integer  'ファイル番号

    strPNAME = ThisWorkbook.Path & "\ftptest.txt" 'ファイル名作成
    nFNO = FreeFile  '空いてるファイル番号を取る

    Open strPNAME For Output As #nFNO 'ファイルを新規作成

    'データ書き込み
    Print #nFNO, "open plaza14.mbn.or.jp" 'openホスト名
    Print #nFNO, "user ken3 XXXXXX←パス" 'userコマンド ユーザー名 パスワード
    Print #nFNO, "cd www"
    Print #nFNO, "pwd"
    Print #nFNO, "get index.html " & ThisWorkbook.Path & "\index.html"

    Close #nFNO  '開いたら閉じようね
    
    'shellでFTPを起動 -nのオプションを付ける
    Shell "ftp -n -s:" & strPNAME

End Sub
パラメータファイルの作成をまず行います。 open plaza14.mbn.or.jp で、FTPサーバーに接続しますOPEN要求 user ken3 XXXXXX で userコマンドを使用してログイン(ユーザー名 パスワード) cd www で 目的のディレクトリに移動する pwd ←これは、関係ないですね(現在ディレクトリ表示) get index.html " & ThisWorkbook.Path & "\index.html" ↑getコマンドで、Index.htmlをexcelブックと同じ位置にget(ダウンロード) なんて感じのパラメータファイルを作成して、 Shell "ftp -n -s:" & strPNAME と、ftp.exe-n と -s:パラメータファイル名 で起動してます。

/* * 4.必要なのは?なんだろう? */

固定で、index.htmlのやりとり、Ftpサーバー名やパスワードも固定でした。 これを汎用的に関数化したい時、どうしましょう? そんな時は、必要なデータを洗い出します。 えっと、必要なのは、 どのサーバーってことで、サーバーの名前 ログインしたいので、ユーザー名とパスワード どこへ?ってことで、ディレクトリ どのファイルを?なので、書き込みファイル名(UPLOAD File) ftp_upfile(ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル) と関数化してみたいと思います。 'ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル 'を受け取り、ftp.exeを起動して、ファイルをUPLOADする
Sub ftp_upfile(strHNAME As String, _
               strUSERNAME As String, _
               strPASS As String, _
               strDIR As String, _
               strUPFILE As String)

End Sub
中身を書かないとなぁ。

/* * 5.パラメータファイルを作成して、Ftp.exeを起動する */

パラメータ(コマンド)ファイルを作成する ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ パラメータファイル名をブック位置+ftppara.datで、作成しました。 strPNAME = ThisWorkbook.Path & "\ftppara.dat" 'ファイル名作成 nFNO = FreeFile '空いてるファイル番号を取る Open strPNAME For Output As #nFNO 'ファイルを新規作成 あとは、受け取った、パラメータをそのまま、ファイルにしてます。 'コマンドデータを書き込む Pint #nFNO, "open " & strHNAME 'open ホスト名 Print #nFNO, "user " & strUSERNAME & " " & strPASS 'user ユーザー名 パスワード Print #nFNO, "cd " & strDIR 'cd xxxx 書き込みディレクトリへ移動 Print #nFNO, "put " & strUPFILE 'put ファイル名 で、ファイルをアップする Print #nFNO, "quit" 'bay で コマンド終了 最終的に、下記のようなファイルが作成されます (ftppara.datの中身) --- open plaza14.mbn.or.jp user ken3 passwordXXX cd www/mm/ put E:\TEST\data999.txt quit ---ここまで。 あとは、ftp.exeを呼べばOKです。 Shell "ftp -n -s:" & strPNAME で、単純に呼んでます。 ※実は、単純に呼びすぎなので、  My Document など、スペースの空いたフォルダーで実行すると、 ftp -n -s:" & strPNAME  が ftp -n -s:c:\My Documents\ftppara.dat となってしまい、正しくファイルが認識されなかったり。  同様に、 put E:\TEST\data999.txt のFTPのPUTコマンドもスペースでデータを区切るので、  put c:\My Documents\data001.txt となると、c:\MyとDocuments\data001.txtの2つと誤認してしまいます。  (たしか、””で囲むとOKだったような記憶があるけど) 下記が、作成したモジュールとテストモジュールです。
Sub TEST()

    Dim strFILENAME As String  'ファイル名受け取り用

    'ファイル名を選択する
    strFILENAME = Application.GetOpenFilename

    'プログラムの中にパスワード埋め込むのよくないけど
    '作った関数をコールする
    Call ftp_upfile("ftp.xxxx.jp", "username", "pass", "data/pc/", strFILENAME)

End Sub
上記のように、パラメータを渡して、下記の作成したモジュールを呼んでいます。 'ホスト名,ユーザー名、パスワード,ディレクトリ,書き込みファイル 'を受け取り、ftp.exeを起動して、ファイルをUPLOADする
Sub ftp_upfile(strHNAME As String, _
               strUSERNAME As String, _
               strPASS As String, _
               strDIR As String, _
               strUPFILE As String)

    Dim strPNAME As String   'パラメーターファイル名
    Dim nFNO     As Integer  'ファイル番号

    'パラメータファイル名をブック位置\ftppara.datとする
    strPNAME = ThisWorkbook.Path & "\ftppara.dat" 'ファイル名作成
    
    'ファイルを新規作成する
    nFNO = FreeFile  '空いてるファイル番号を取る
    Open strPNAME For Output As #nFNO 'ファイルを新規作成

    'コマンドデータを書き込む
    Print #nFNO, "open " & strHNAME  'open ホスト名
    Print #nFNO, "user " & strUSERNAME & " " & strPASS 'user ユーザー名 パスワード
    Print #nFNO, "cd " & strDIR      'cd xxxx 書き込みディレクトリへ移動
    Print #nFNO, "put " & strUPFILE  'put ファイル名 で、ファイルをアップする
    Print #nFNO, "quit"              'bay で コマンド終了

    'ファイルを閉じる(作成が終了したので)
    Close #nFNO  '開いたら閉じようね
    
    'shellでFTPを起動 -n,-s:ファイル名 のオプションを付ける
    Shell "ftp -n -s:" & strPNAME

End Sub
-【けんぞう!】--------------------------------------------------------- ASPが利用可能なレンタルサーバーをお探しのアナタ、 http://www.ken3.org/asp/server.html ← けんぞうも使っているサーバーの紹介 『おっIISでbasp21でメール送信、mdbも使えるよ』(三流PG:31歳) ------------------------------------------------------------------------ 

/* * 6.終わりの挨拶 */

今回は、ftp.exeを使用して、ファイルをFTPでUP(put)してみました。 いろいろとまだまだ、改良点が必要だけどなんとかなったかなぁ? 改良点?問題点も間違いだろ?って? 厳しいなぁ、みなさん。 問題点は、スペースありのフォルダー名と複数ファイルのUPかなぁ。 まだまだ、ですね。 こんな方法もあるってことで、何か読者の心に残れば、うれしいです。 *私の独り言をうまく消化してくださいね。 偉そうな感じ悪い人になりかけてる不親切なKen3でした。 ~~~~~~~(↑オイオイ、また攻撃食らうぞ(笑))


検索して目的の情報を探す。

目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。

カスタム検索
三流君(site:www.ken3.org) 内を Googleを利用してキーワード する

ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。

質問や要望など メッセージを送る(三流君に連絡する)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい



(感想や質問・要望 メッセージはHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

リンクや広告など

項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

Blog:[三流君の作業日記]/ [サンプルコードのゴミ箱]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]