<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 |
イミディエイトと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 |
やりたいことは、新規のデータ追加なので、
・現在のフォーム内容をクリア
・最終行に移動
です。
Private Sub btnADDNEW_Click() '新規のボタン
'フォームの値をクリアする
txtTITLE = ""
txtFILENAME = ""
txtMEMO = ""
imgBOX.Picture = LoadPicture("") '画像を消す(私は忘れた(笑))
'選択位置を変更
nMAX = nMAX + 1 '新規追加されたので、Max行数を増やす
yCNT = nMAX + 1 '行カウンタはタイトル行があるので+1する
Rows(yCNT).Select '行を選択(空白だけど)
LabCounter = "新規データ" 'ラベルに新規データと文字を入れる
End Sub |
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 |
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 |
ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、
|
気になったジャンル↓を選択してください。 人気記事(来場者が多いTOP3): Excel関係: Access関係: その他:VBAの共通関数やテキストファイルの操作など 開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う] 仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力] ※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。 |
Blogとリンク:[三流君の作業日記]/
[VBAやASPのサンプルコード]/
広告-[通販人気商品の足跡]