[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.063 Excel UserForm で データ・フォームの機能を真似てみる

Excel UserForm で データ・フォームの機能を真似てみる

メルマガ発行内容

<Excel UserForm で データ・フォームの機能を真似てみる>

こんにちは、三流プログラマーKen3です。 4月新たな環境になった人達は落ち着きましたか? *まだ新入社員君達はHPやメルマガみて遊ぶ余裕は無いか(笑) なんて定型の挨拶はこのくらいにして、 ~~~~~~~~~~~~~~~~~~ 今回は、 ユーザーフォームの作成で、 データ・フォームの機能を真似て作ってみたいと思います。 サンプルファイルは、 http://www.ken3.org/vba/lzh/vba063.lzh に保存されてます。 test061-book.xlsを開いて、穴を探して見て下さい。 *こんな処理ができてない、あんな処理も・・・など出てきますよ(笑)

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

掲示板 http://www.ken3.org/cgi-bin/bbs/vba/wforum.cgi に貰った質問、 >投稿日 : 2003/04/03(Thu) 15:43 >投稿者 : sattoch >タイトル : またできないことが > >こんにちは。やっと閉じることが出来ました。 >それで、もう一つお尋ねしたいことができました。 >入力して、たとえば「追加」のボタンをつくって >それをクリックすれば入力したものがシートにうつされて >また入力フォームがきれいになって、そこに入力してまた >「追加」ボタンを押すとそれがシートにうつされて・・・ >となるようにするのは難しいでしょうか。 --- [No.61 Excel Form 閉じる方法 Unload Me] http://www.ken3.org/backno/backno_vba13.html#61 で、 Unload Meでユーザーフォームを閉じる方法を解説しました。 今回は、 Excelのメニューでデータ・フォームとやると標準で入力フォームが出ます。 この機能を少しまねてみたいと思います。 機能のボタンを見ると  新規  削除  元に戻す  前を検索  次を検索  検索条件  閉じる それと、1 / 3 (n / MAX)と件数表示 あとはスクロールバーですね。

/* * 2.まずは、1 / 3 (n / MAX)と件数を管理 */

シートのイメージは _____A列___________B列_______C列____________D_______________________E_______ 1行 画像タイトル ファイル名 コメント 画像ベースディレクトリ→ D:\temp\ 2行 サンタ 001.gif ケーキ写真 3行 お正月 012.jpg XXXXXXXXXX です。 まずは、1 / 3 (n / MAX)と件数をフォームに表示したいので、 ラベルコントロールを追加します。 コントロール名は、labCounterにしました。 さてと、まずはデータの行数を数えないとね。 グローバル変数にnMAX As Integerを追加して変数で管理しますか。 Dim yCNT As Integer '行カウンター Dim nMAX As Integer '最終行を覚えておくカウンター No.63で追加 フォームが開いた時に実行されるイベント、 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ _Initializeで数えます。
Private Sub UserForm_Initialize()

    'ディレクトリが入って無い時、ブックのパスを代入
    If Len(Sheets("DATA").Range("E1")) = 0 Then
        Sheets("DATA").Range("E1") = ThisWorkbook.Path & "\"
    End If

    '初期処理
    yCNT = 2   '初期値の2行目を代入

    'データの数を数えます No.63で追加
    nMAX = 0   '0で初期化
    While Len(Cells(2 + nMAX, "A")) <> 0 '2行目からA列にデータあるかチェック
        nMAX = nMAX + 1  'カウンタを増やす
    Wend
    Debug.Print "_Initialize nMAX=" & nMAX 'デバックで数値を表示

    'セルの値をフォームのテキストボックスに代入する
    Call SheetToForm

    '画像ファイルを表示する
    Call PUTPicture

End Sub
登録されているデータの行数を数えたいので、 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 単純にLen(Cells(行,列))<>0を条件にループを行います。 'データの数を数えます No.63で追加 nMAX = 0 '0で初期化 While Len(Cells(2 + nMAX, "A")) <> 0 '2行目からA列にデータあるかチェック nMAX = nMAX + 1 'カウンタを増やす Wend Debug.Print "_Initialize nMAX=" & nMAX 'デバックで数値を表示 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ で確認の意味でイミディエイトウインドウに変数の値を表示します。 イミディエイトとDebug.Printの説明は --> http://www.ken3.org/vba/iwind.html を見て下さい。 Len(Cells(2 + nMAX, "A")) ~~~~~~~~~~~~~~~~~~~~~~~~~ 次の行が存在するかチェックのため、 タイトル行で+1、次の行で+1なので、 2+nMaxで確認してます。 行数を数え終わったら、今度はn/nの表示です。 'セルの値をフォームのテキストボックスに代入する Call SheetToForm と、SheetToFormでシートの値をフォームに代入している関数があるので、 ここで、セットしてみたいと思います。
Sub SheetToForm() 'セルの値をフォームのテキストボックスに代入する
    txtTITLE = Sheets("DATA").Cells(yCNT, "A")
    txtFILENAME = Sheets("DATA").Cells(yCNT, "B")
    txtMEMO = Sheets("DATA").Cells(yCNT, "C")
    Rows(yCNT).Select   '行を選択 vba049で追加
    LabCounter = (yCNT - 1) & "/" & nMAX 'ラベルに現在行を追加 vba063で追加
End Sub
LabCounter = (yCNT - 1) & "/" & nMAX で作成したラベルコントロールに文字列をセットしてます。

/* * 3.新規(追加)のボタン処理 */

次は、新規(追加)のボタン処理です。 ボタンコントロールを追加します。 名前はbtnADDNEWとします。 やりたいことは、新規のデータ追加なので、 ・現在のフォーム内容をクリア ・最終行に移動 です。
Private Sub btnADDNEW_Click() '新規のボタン
    'フォームの値をクリアする
    txtTITLE = ""
    txtFILENAME = ""
    txtMEMO = ""
    imgBOX.Picture = LoadPicture("") '画像を消す(私は忘れた(笑))
    '選択位置を変更
    nMAX = nMAX + 1 '新規追加されたので、Max行数を増やす
    yCNT = nMAX + 1 '行カウンタはタイトル行があるので+1する
    Rows(yCNT).Select        '行を選択(空白だけど)
    LabCounter = "新規データ" 'ラベルに新規データと文字を入れる
End Sub
フォームに””の空文字をセットして、新規の入力用にデータを消してます。 忘れずに画像のエリアも消します(私は消し忘れた三流だなぁ(笑)) 次は、行移動です。 単純にnMAX = nMAX + 1 で最終行を増やし、 現在行カウンタを調整、n/nラベルに新規データとセットしてます。

/* * 4.更新ボタンを追加する */

自動的にシートにセットされていた処理を、 更新ボタンが押されたらセットする処理に変えます。 btnUPDATEとボタンコントロールを作成します
Private Sub btnUPDATE_Click()
    'データセットの確認
    If MsgBox("データを更新します", vbYesNo, "確認") = vbYes Then
        '単純にフォームからデータをシートへ転記する
        Sheets("DATA").Cells(yCNT, "A") = txtTITLE
        Sheets("DATA").Cells(yCNT, "B") = txtFILENAME
        Sheets("DATA").Cells(yCNT, "C") = txtMEMO
    End If
End Sub
単純にフォームの項目をシートへセットしています。

/* * 5.削除ボタンの処理 */

データを削除するボタンを作成します。 削除の確認メッセージを表示 行を削除する カウンタを−1する btnDELとボタンコントロールを作成します。
Sub btnDEL_Click()
    '削除を確認する
    If MsgBox("データを削除します?", vbYesNo, "確認") = vbYes Then
       Rows(yCNT).Select  '現在行を選択
       Selection.Delete Shift:=xlUp '選択されている行を削除する
       If nMAX <> 1 Then nMAX = nMAX - 1  '行頭以外なら最大行数を−1する
       Call SheetToForm   '削除後にデータを表示
    End If
End Sub
普通にMSGBOXで削除の確認を行います。 マクロ記録で記録した行削除を行います。 Rows(yCNT).Select '現在行を選択 Selection.Delete Shift:=xlUp '選択されている行を削除する 先頭行の削除以外なら、最大行数を−1する シートが削除で移動されているので、 データを再表示するために、Call SheetToForm と関数を呼ぶ。

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

今回は、 Excel データ・フォームの機能を真似てみる でした。 実は、まだまだ、操作的になっとくいかないバグがあるので、 サンプルファイル、 http://www.ken3.org/vba/lzh/vba063.lzh をダウンロードして、test061-book.xlsを開いて、穴を探して見て下さい。 *こんな処理ができてない、あんな処理も・・・など出てきますよ(笑) 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.61 Excel Form 閉じる方法 Unload Me] http://www.ken3.org/backno/backno_vba13.html#61 で、 Unload Meでユーザーフォームを閉じる方法を解説しました。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

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

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

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

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

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

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

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



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