
No.6ベストアンサー
- 回答日時:
こんにちは。
先程のコードでは、コマンドボタンの動作がかかれていませんでしたので、修正マクロをお知らせします。下記のコードを同じ方法でコピー・ペーストしてみて下さい。
あなた様の思い通りの動作になると思います。
私は、趣味でVBAやVbでプログラミングをやっている仲間が集まっているサークルに所属しております。ここでコードの説明をするのは非常に難しいので、事務局のほうへお電話をいただけないでしょうか。お金は要りません。お電話で詳しく教えさせていただきます。
事務局には、午後1時から午前0時迄常時つめておりますので、この時間内であればお電話で話すことができると思います。
043(278)2548
お手数をおかけいたしますが、よろしくお願いいたします。
Private Sub CommandButton1_Click()
If Me.Tx1.Text = Workbooks("顧客台帳.xls").Worksheets(1).Range("A1").Value Then
MsgBox "登録された顧客はおりません。", vbOKOnly + vbCritical, "処 理 エ ラ ー"
Else
Me.Tx1.Text = Me.Tx1.Text - 1
Me.Tx2.Text = Workbooks("顧客台帳.xls").Worksheets(1).Range("A1:" & Cells(Rows.Count, 1).End(xlUp).Address).Find(Me.Tx1.Text, lookat:=xlWhole).Offset(0, 1).Value
End If
End Sub
Private Sub CommandButton2_Click()
Dim myCnt1 As Integer
Dim myCnt2 As Integer
If Me.Tx1.Value = Workbooks("顧客台帳.xls").Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Value Then
MsgBox "登録された顧客はおりません。", vbOKOnly + vbCritical, "処 理 エ ラ ー"
Else
Me.Tx1.Text = Me.Tx1.Text + 1
Me.Tx2.Text = Workbooks("顧客台帳.xls").Worksheets(1).Range("A1:" & Cells(Rows.Count, 1).End(xlUp).Address).Find(Me.Tx1.Text, lookat:=xlWhole).Offset(0, 1).Value
End If
End Sub
Private Sub Tx1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim myRange As Range
Set myRange = Workbooks("顧客台帳.xls").Worksheets(1).Range("A1:" & Cells(Rows.Count, 1).End(xlUp).Address).Find(Me.Tx1.Text, lookat:=xlWhole)
If myRange Is Nothing Then
MsgBox "登録された顧客がおりません。", vbOKOnly + vbCritical, "入 力 エ ラ ー"
Cancel = True: Exit Sub
Else
Me.Tx2.Text = myRange.Offset(0, 1).Value
End If
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
End
End Sub
kazuhiko5681様
本当にあつかましいお願いにもかかわらず、またまたこのような丁寧なご指導いただき感謝の言葉もございません。本当にありがとうございます。
今回はkazuhiko5681様はじめお二人の方にご指導いただき、得難い勉強をさせていただきました。
まだ始めたばかりで、先がみえませんが今後とも一生懸命勉強していつかは、私も皆様のように人様にアドバイスできるようにがんばりたいと思いますので、今後ともよろしくお願いします。
心より感謝します。
tomosato
No.5
- 回答日時:
再びmaruru01です。
標準モジュール
'ユーザーフォームでも使用するので、Publicで宣言。
'データ数が分からないでの動的に宣言。
Public Data1() As String
'データ数
Public DataCount As Long
Sub input1()
'以下の変数はこのプロシージャでしか使用しないので、中に入れます。
'ループカウンタはInteterよりLongの方がいい。
Dim i As Long
Dim j As Long
Sheets("Sheet1").Select
'表形式の場合は、CurrentRegionプロパティでデータ数を取得出来る。
'見出し行の分-1する。
DataCount = Range("B10").CurrentRegion.Rows.Count - 1
'配列の再宣言
Redim Data1(1 To 5, 1 To DataCount)
'(b~f列なら、列番号は2~6ですよね?)
For i = 2 To 6
'最終データ行数は、データ数+開始行-1で取得出来る
For j = 11 To DataCount + 11 - 1
'- 1、- 10は、配列のインデックスが1から始まっているから
Data1(i - 1, j - 10) = Cells(j, i)
Next j
Next i
End Sub
ユーザーフォームのコードモジュール
'宣言部に
Private myCollect As New Colletion 'コレクションオブジェクトの宣言
Private ViewNumber As Long '現在表示されているデータの行番号
'Initializeイベントに
Private Sub UserForm_Initialize()
Dim i As Long
’コレクションの追加
With myCollect
.AddItem:=text1 'ID
.AddItem:=text2 '氏名
.AddItem:=text3 '部署
・・・略(シートの項目列の順に追加する、もちろん配列の列数と追加するテキストボックスの数は一致すること)
End With
'とりあえず何かデータを表示(とりあえず、先頭のデータ)
ViewNumber = 1
For i = 1 To 5
myCollect(i).Text = Data1(i, 1)
Next i
End Sub
'次のデータへ移動するボタン
Private Sub CommandBUtton1_Click()
Dim i As Long
If ViewNumber = DataCount Then
'最後のデータの場合は移動しない
MsgBox "最後のデータです。"
Exit Sub
Else
ViewNumber = ViewNumber + 1
For i = 1 To 5
myCollect(i).Text = Data1(i, ViewNumber)
Next i
End If
End Sub
'前のデータへ移動するボタン
Private Sub CommandBUtton2_Click()
Dim i As Long
If ViewNumber = 1 Then
'先頭のデータの場合は移動しない
MsgBox "先頭のデータです。"
Exit Sub
Else
ViewNumber = ViewNumber - 1
For i = 1 To 5
myCollect(i).Text = Data1(i, ViewNumber)
Next i
End If
End Sub
なお、こちらの都合で、配列の行と列の順番を入れ替えました。
maruru01様
身勝手なお願いにもかかわらず、根気よく丁寧にご指導いただき本当にありがとうございます。
おかげさまで、目的をはたすことができました。
maruru01様はじめお二人の方にご指導いただき、今回も書籍では得られない勉強をさせていただきました。
いつかは、私もmaruru01様の1/100でも人様にアドバイスできるようにがんばりたいと思いますので、今後ともよろしくお願いします。
心より感謝します。
tomosato
No.4
- 回答日時:
度々の補足お手数をおかけいたしました。
簡単に実現することができます。早速サンプルマクロを作ってみました。次のように操作してみて下さい。
1.新規ブックを立ち上げ、ALT+F11キーを押してVBE画面を表示させる。
2.ユーザーフォームを1つ挿入し、テキストボックスを2個配置する。
3.テキストボックスのオブジェクト名をTx1.Tx2に変更する。
4.テキストボックスをダブルクリックして、フォームモジュールを開く。
5.Changeイベントのコードが書けるように準備されるので、これを削除し、下記のこーどをコピー・ペーストする。
あらかじめシート1のA列にID・B列に顧客名を入力しておいて下さい。
ユーザーフォームを立ち上げ、tx1にIDを入力するとtx2に自動的に顧客名が入力されます。
もし、不具合等がありましたら遠慮なくお知らせ下さい。あなた様のおやりになりたいことが実現するまで一緒に考えて生きたいと思います。
Private Sub Tx1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim myRange As Range
Set myRange = Workbooks("顧客台帳.xls").Worksheets(1).Range("A1:" & Cells(Rows.Count, 1).End(xlUp).Address).Find(Me.Tx1.Text, lookat:=xlWhole)
If myRange Is Nothing Then
MsgBox "入力されたIDは登録されていません。", vbOKOnly + vbCritical, "入 力 エ ラ ー"
Cancel = True: Exit Sub
Else
Me.Tx2.Text = myRange.Offset(0, 1).Value
End If
End Sub
kazuhiko5681様
何度もお手数おかけしました
ご指導のとおり作成しましたところ、見事に作動しました
本当にありがとうございました。
あつかましい限りですが、もう一つお願いがあります
今後の学習のためにプログラムの1行目の( )内と3行目データ範囲指定をしているところの各コマンドの意味を解説していただけないでしょうか。
ご都合の許す範囲で結構ですので、お聞き届けいただければ幸いです。
No.3
- 回答日時:
こんにちは。
maruru01です。まず、コレクションを使ってフォーム上のテキストボックスをインデックスで操作出来るようにします。
コレクションについては以下を参照して下さい。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=172927
この時、AddItemメソッドで追加するテキストボックスの順番をデータ一覧表の項目の順と一致させることが必要です。
例えば配列kokyakudat(i,j)の0列目がIDなら、他のデータは1列目からになりますが、Collectionオブジェクトのインデックス値は1から始まるので、順番(と項目数)が同じならちょうどいいわけです。
で、とりあえず、iが列でjが行で、0列がIDとすると、
For j = (行の最初) To (行の最後)
If kokyakudat(0, j) = tx1.Text Then
'見つけた行のデータを入力する
For i = 1 to (列番号の最後)
myCollect(i).Text = kokyakudat(i, j)
Next i
Exit For
End If
Next j
If j > (行の最後) Then
MsgBox "データが見つかりません。"
End If
こんな感じです。
ところで、このようなデータは配列より、ユーザー定義型(構造体)にした方がいいのではないでしょうか。
構造体なら、各項目に適当な変数名を付けることが出来るので、コードの見た目で分かり易いです。
配列だと、何番目が何のデータかコード見ただけでは分からないですよね。
まあ、構造体にすると上記のコレクションは使えません(使っても意味がない)が、項目数がそれ程多くない(20以下ぐらい)なら、1つずつ入力してもいいでしょう。
テキストボックスにも分かりやすい名前を付けておけば、何のデータをどこにいれたかが、確認し易いですし。
ちなみに、この手のデータ検索は、Accessを使用した方がいいと思いますが。
参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=172927
この回答への補足
maruru01様
いつもお手数おかけして申し訳ありません
相変わらず丁寧なご指導に感謝します
私の不勉強のため、せっかく丁寧にご指導頂いたにもかかわらず、内容が理解できないところが多数あります。
本来ならば、勉強し直してから再度お尋ねするのが筋だと思いますが、今回のユーザーフォームの件はどうしても解決してみたいので、あつかましいかぎりですが、現在作っているマクロの概要を以下に記載し、どこをどのようになおすべきか再度おたずねする次第です。
とりあえず、IDを入力し、氏名が表示できれば、後は自分で何とかしたいと思います。
お時間とお気持ちの許す範囲で結構ですので見ていただければ幸いです
エクセルのsheet1のb10~f10にID,氏名,部署のフィールドがあり、その下に500件程のデータが入力済みです。
マクロの記述の概要は以下のとおりです
Dim data1(1000,10)
Dim i As Integer
Dim j As INteger
Sub input1()
Sheets("Sheet1").Select
Range("b11").Select
'データを配列に格納
For i = 11 To 1000
If Cells(i,0) = "" Then Exit For
For j = 1 To 7
data1(i, j) = Cells(i, j)
Next i
Next j
UserForm1.Show
End Sub
ユーザーフォームの概要とマクロ
UserForm1
TextBox1・・・ID入力欄
TextBox2・・・氏名をここに表示させたい
TextBox3・・・部署をここに表示させたい
CommandBUtton1・・・・次のIDへ移動させたい
CommandButton2・・・・前のIDへ移動させたい
ユーザーフォームのマクロ
*をつけたところが、maruru01さんのご指導を私なりに理解して加えた部分です(たぶん理解ができていないと思いますが)
*Private myCollect As New Collection・・・変数の宣言部分?
Private Sub UserForm_Click()
*With myCollect・・・・コレクションの作成?
* .Add Item:=text1
* .Add Item:=text2
*.Add Item:=text3
*End With
*For i = 11 to 1000
* If data1(i,1) = tx1.Text Then
* For j = 1 to 7
* myCollect(j).Text = data1(i,j)
* Next j
* Exit For
* End If
*Next i
* If i>1000 Then
* MsgBox = "データなし"
* End If
End Sub
Privare Sub CommandButton1_Click()
未作成
End Sub
No.2
- 回答日時:
早速の補足有難うございます。
まだよくあなた様のおやりになりたいことが理解できません。ユーザーフォームの構成を教えていただけないでしょうか。それとVBを使うのでしょうか。それともVBAを使うのでしょうか。その点についても教えて下さい。お手数をおかけいたしますが、よろしくお願いいたします。
この回答への補足
kazuhiko5681様
ご親切感謝します。
現在エクセルVBAを学習中です
実際に業務で使用できるマクロを作成しながら勉強しようと考えています。
現在、エクセルに入力してあるお客様のIDと氏名、購入商品等のデータ一覧表をfor~nextでkokyakudat(i,j)という配列に読み込ませてあります。
いままで、データ入力を直接エクセルの一覧表に入力していたのですが、今度、入力専用のユーザーフォームを作り、ここから入力したいと考えました。
作成したユーザフォームの構成は、ユーザID入力用にテキストボックス1(tx1)、氏名表示用にテキストボックス2(tx2)、以下購入済み製品を表示するボックスがあります。
このTX1にユーザIDを入力すると、このIDを判別してtx2にkokyakudat(i,j)にある氏名を自動的に読み込むようにできないだろうかということなのですが、可能でしょうか
VBAについて初心者ですので、テキストボックスは入力専用であり、フォーム外のデータを読み込み表示するボックスが別にあるのか、それすらも判断できないまま質問しております。申し訳ありません
お手数ばかりおかけしますが、ご指導いただければ幸いです
No.1
- 回答日時:
あなた様のおやりになりたいことを具体的に教えていただけないでしょうか。
いい方法をアドバイスできるかと思います。お手数をおかけいたしますが、よろしくお願いいたします。
この回答への補足
kazuhiko5681様
わかりにくい質問で申し訳ありません。具体的にやりたいことを述べるべきでしたやろうとしていることは、ユーザーフォームでお客様のIDナンバーを入力すれば
あらかじめ配列に読み込んであるお客様の氏名や各情報をユーザーフォームに表示し、新しいデータを入力するといったことをやりたいのですが可能でしょうか
ちょうどエクセルのデータのフォームという機能をユーザーフォームでやりたい
ということなのですが
よろしくお願いします
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Dlookupにエラーがでてしまう 1 2022/10/31 14:35
- Visual Basic(VBA) 検索のユーザーフォームの表示について 1 2023/03/27 23:31
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- JavaScript 読み込んだQRコードをフォームに受け渡したい 1 2023/05/18 11:18
- Visual Basic(VBA) VB.net フォーム 親子 1 2022/07/04 19:00
- Access(アクセス) テキストボックスの値をテーブルに入力したい 2 2022/06/28 12:08
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- その他(プログラミング・Web制作) 【python】Excelファイルを読み込む際の日付の表示形式を任意にする 2 2022/11/24 14:21
このQ&Aを見た人はこんなQ&Aも見ています
-
VBAのフォームでTextBoxがいっぱいある時
Access(アクセス)
-
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
-
4
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
5
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
6
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
7
ユーザーフォームのテキストボックスに前回入力した値を表示する Excel
Visual Basic(VBA)
-
8
ユーザーフォーム内のテキストボックスからオートフィルター抽出を行う方法
Visual Basic(VBA)
-
9
[Access]帳票フォームにて連続する非連結コントロールに個々の値を入れるには
Access(アクセス)
-
10
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
11
エクセルVBA テキストボックスに3桁ごとにコンマ
Visual Basic(VBA)
-
12
Accessでテーブルの値をテキストボックスに代入するには?
Access(アクセス)
-
13
VBAのコマンドボタンの文字列の改行方法は?
Visual Basic(VBA)
-
14
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
15
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
16
Accessのレポート上のテキストボックス値を設定したい
その他(データベース)
-
17
VBAのテキストボックスに文字列を貼り付ける方法
Access(アクセス)
-
18
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
19
TextBoxコントロールを引数として渡すには?
その他(教育・科学・学問)
-
20
ユーザーフォームのSetFocusが働かない?
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
カンマからスラッシュに
-
ビットシフトについて
-
二分探索の平均探索回数
-
C言語の問題なのですが、分から...
-
[COBOL]日付比較 その2
-
Fortran カンマを含む数値デー...
-
散布図参照先設定時にエラーが...
-
メモ帳(テキストデータ)をExc...
-
多量のSUMIF式を軽くしたい
-
【VBA】データを入力後に,同一...
-
エクセルで2つの時系列のデー...
-
C#でデータのファイル保存と保...
-
3つの情報の論理積がわかりませ...
-
C#にてDropDownListの値を動的...
-
エクセルの関数
-
このコードの修正点はありますか?
-
ユーザーフォームのテキストボ...
-
ドラゴンクエストのぼうけんの...
-
データ取得時のエラーに関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
特定のデータの抽出方法を教え...
-
ユーザーフォームのテキストボ...
-
二分探索の平均探索回数
-
EXCELVBAでSQLserverからデータ...
-
Accessで該当データにフラグを...
-
VBA 空白セルを削除ではない方...
-
この行は既に別のテーブルに属...
-
Excel VBAでのオートフィルター...
-
[C言語] コメント文字列を無視...
-
エクセルで2つの時系列のデー...
-
アクセス2000で画像データ...
-
CString型の文字列連結について
-
カンマからスラッシュに
-
VBにおいてフォーム間の変数の...
-
<VB>String→Object
おすすめ情報