[三流君] −−> [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でユーザーフォームを閉じる方法を解説しました。

フィードバック

VBA系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.063を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

ページフッター(リンクや広告など)


[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます


広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列

情報を探す

情報を探すならGoogleかな?

↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
Google
Web www.ken3.org
www.microsoft.com support.microsoft.com

あとは、項目別にMSでお勉強かな?
◆ マイクロソフト サイトの歩き方
◇ How-To インデックス
◇ FAQ インデックス
◇ スキルレベル別おすすめコンテンツ
◇ テクノロジ マップ
◇ テーマ別技術資料一覧

書籍の購入

Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??

コンピュータ書籍の発送がハヤイ専門店

コンピュータの本・専門店
種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり

amazon.co.jpでキーワード別チェック

下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・