
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も見ています
-
これまでで一番「情けなかったとき」はいつですか?
これまでの人生で一番「情けない」と感じていたときはいつですか? そこからどう変化していきましたか?
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
最強の防寒、あったか術を教えてください!
とっても寒がりなのですが、冬に皆さんがされている最強の防寒、あったか術が知りたいです!
-
テレビやラジオに出たことがある人、いますか?
テレビやラジオに取材されたり、ゲスト出演したことある方いますか?
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
VBAのフォームでTextBoxがいっぱいある時
Access(アクセス)
-
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
VBA エンターキーでイベントに入りたい。
PowerPoint(パワーポイント)
-
-
4
C#テキストボックスの文字を配列にいれてその後表示する
C言語・C++・C#
-
5
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
6
VBAのテキストボックスに文字列を貼り付ける方法
Access(アクセス)
-
7
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
8
ExcelVBAのユーザーフォームの中に線を引きたい
Visual Basic(VBA)
-
9
ユーザーフォームをホイールでスクロールする方法(Excel2000VBA)
Excel(エクセル)
-
10
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
11
配列で格納したものをmsgboxで表示する方法について
Access(アクセス)
-
12
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
13
UserForm1.Showでエラーになります。
工学
-
14
ユーザーフォームのテキストボックスに前回入力した値を表示する Excel
Visual Basic(VBA)
-
15
VBA フォームのテキストボックスにセルの値を表示させたいが改行していたら改行もあわせて表示させたい
Excel(エクセル)
-
16
Excel VBA 空白セルがあったらメッセージボックスで知らせたい
Visual Basic(VBA)
-
17
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
18
Accessでテーブルの値をテキストボックスに代入するには?
Access(アクセス)
-
19
Excel-VBA>コントロールをグレイアウトするには?
Excel(エクセル)
-
20
アクセスでのキー違反とは??
Access(アクセス)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
VBA 毎日取得するデータを順番...
-
ユーザーフォームのテキストボ...
-
ACCESSからEXCELに出力する際、...
-
GETはできるがPOSTができない、...
-
外部データの更新がうまくでき...
-
リングバッファって何ですか
-
ブレーカー落ちで壊れたりしな...
-
EXCELVBAでSQLserverからデータ...
-
ページ数を求めたい
-
Sheet2の日付をキーにオートフ...
-
【VBA】データを入力後に,同一...
-
MSCommを用いたRS-232-Cデータ転送
-
特定のデータの抽出方法を教え...
-
二分探索の平均探索回数
-
VB6でCSVの取込をする
-
複数のブックのデータを集めて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
VBA 空白セルを削除ではない方...
-
メモ帳(テキストデータ)をExc...
-
配列でデータが入っている要素...
-
ブレーカー落ちで壊れたりしな...
-
特定のデータの抽出方法を教え...
-
EXCELVBAでSQLserverからデータ...
-
エクセルで2つの時系列のデー...
-
VBAを使ってOutlookメール本文...
-
Accessで該当データにフラグを...
-
この行は既に別のテーブルに属...
-
[C言語] コメント文字列を無視...
-
ユーザーフォームのテキストボ...
-
二分探索の平均探索回数
-
Excel VBAでのオートフィルター...
-
多量のSUMIF式を軽くしたい
-
カンマからスラッシュに
-
CString型の文字列連結について
-
C# でDataTableの更新を高速化...
おすすめ情報