VBAでお世話になっています。
UserForm上のComboBox1~30の各値を元に
Sheet2上のデータをSheet4上に貼り付けるVBAを組んであります。
ComboBox1の値を元に行なう作業(VBA)とComboBox30を元に行なう作業は同じなのですが、
但し記述は50行程×30あるので全記述をすると60kを超えてエラーになります。
ですので
i = 0
For a = 1 To 30
従業員番号 = UserForm1.ComboBox a.Text + 10 'ここでエラー .CombBox a 反転表示
With Sheet4
.Cells(15 + i, 3).Value = Sheet2.Cells(従業員番号, 1).Value
.Cells(17 + i, 3).Value = Sheet2.Cells(従業員番号, 2).Value
.Cells(16 + i, 6).Value = Sheet2.Cells(従業員番号, 3).Value
・
・
・
End with
i=i+4
Next a
としたら、「コンパイルエラー メソッド・データメンバが見つかりません」が返ります。
ComboBoxの番号を指定しないとわからんわい、との事と思います。
(a) "a" _a としてもだめですし、cmd=CombBox+aを足してみたら cmd=1になるし、
cmd="CombBox"+a は「型が一致しない」エラー・・・等々
なんとかCombBoxの1~30をFor文でループしたいのです。ご教授をお願いします。
No.6ベストアンサー
- 回答日時:
補足を読んでかなりの初心者さんだと思いますので(自分もそう変わらないのですが)、もう少し詳しく説明します。
#4でも書きましたが、一度に複数のことをやろうとしているので原因がわかりにくいんだと思いますよ。
従業員番号 = UserForm1.Controls("ComboBox" & a).Text + 10
は1行ですが、実は4つの処理をしていることに気づきましょう。4つの処理とは
1. "ComboBox"という文字列とFor文のカウンタ変数"a"を連結する
2. 1の文字列を名前とするコンボボックスのTextプロパティの値を取得する
3. 2で取得した値に10を足す
4. 3の結果を変数"従業員番号"に代入する
#3の補足を見ると値が確認できたということなので、1と2はOKなわけです。したがって、ここはこれ以上いじる必要がないです。"を付けたり外したりするのは1に影響することで、せっかくうまくいってる所をいじっても意味がないです。
で、次は3を確認しましょう。#2のFor文の中身を次のように書き換えます。デバッグ用の変数vを使うのでVariantで宣言しといてください。
v = UserForm1.Controls("ComboBox" & a).Text + 10
MsgBox v
これでエラーがでなければ(もちろん値が正しいかも確認できれば)、3はOKですね。OKなら4に進みます。もう一度For文の中を書き換えます。3までがOKだったら、ここでエラーが出るはずです。
v = UserForm1.Controls("ComboBox" & a).Text + 10
MsgBox v
従業員番号 = v
以上を試して結果を教えてください。教えて欲しいことは
* 1~4のどこでエラーが出たか。
* エラーは常にこるのか、特定のコンボボックスで起きるのか
* エラーが起きたときコンボボックス.Textの値はなんなのか
* 計算結果(vの値)はどうなっているか
* 従業員番号の型は?
他にもあるかしれないけどとりあえずそれだけ教えてください。
#4の補足ですが、プロシージャ全体としてどうすればいいのかということなら残念ながら回答できません。ちょっと情報不足です。プロシージャの組み立て方に関しては別に質問されたほうがいいでしょう。
masa pee さん 何度も有難う御座います。
下記で解決致しました。
Dim v As Integer 'Variant
Dim a As Integer
Dim 従業員番号 As Integer
Dim I As Integer
I = 0
For a = 1 To 30
If UserForm1.Controls("ComboBox" & a).Text = "" Then GoTo 100
v = UserForm1.Controls("ComboBox" & a).Text + 10
'MsgBox v
従業員番号 = v
With Sheet4
.Cells(15 + I, 3).Value = Sheet2.Cells(従業員番号, 1).Value 'ふりがな
.Cells(17 + I, 3).Value = Sheet2.Cells(従業員番号, 2).Value
・
・
・
End With
100:
I = I + 4
Next a
詳細は下記です。
(1)
Dim v As Variant '1回目はOKだが、ループ途中でエラー
↓
Dim v As Integer
(2)
もしもComboBox1~30のうち未入力箇所があると、その回数目の時(Box5が未入力なら5回目のループの時)
v = UserForm1.Controls("ComboBox" & a).Text + 10 'ここでエラー
↓
If UserForm1.Controls("ComboBox" & a).Text = "" Then GoTo 100 '追記
・
・
・
100: '追記
お世話を掛けました。有難う御座いました。
No.9
- 回答日時:
s_husky です。
確かに、
? "123" + 10
133
で、エラーが出ません。
しかし、「解決しました!」は、「うーん!」です。
? Val("123") + 10
133
? CInt("123") + 10
133
というのを標準作法にされることを勧めておきます。
s_husky さん 有難う御座います。
>「解決しました!」は、「うーん!」です。
申し訳ありません。ごもっともですよね。
なにぶん、VBAを勉強し始めて日が浅いので皆さんにはご迷惑をかけます。
ですが、「解んないので教えて~」と言っても、やさしく教えてくれる「教えて!goo」を私は気に入っています。
「そんなのは自分で調べろ!!検索すればあるだろっ」ってサイトもありますよね。
「解決したら、全員に報告しろっ、」ってサイトもありました。
>というのを標準作法にされることを勧めておきます。
有難う御座います。勉強したいと思いました。
疑問点があったらまた質問させて頂きたいので、その節には宜しくお願い致します。
No.8
- 回答日時:
こんにちは。
Wendy02です。全体が見えていませんので、良く分りませんが、変数の「従業員番号」は、一旦、どこかで置き換えたほうがよいです。
例えば、
j = 従業員番号
With Sheet4以下は、General プロシージャにしました。
'-------------------------------------------
Private Sub CommandButton1_Click()
Dim a As Integer
Dim num As Variant
Dim i As Long
Dim j As Long
i = 5
j = 従業員番号
For a = 1 To 30
num = UserForm1.Controls("ComboBox" & CStr(a)).Text
If IsNumeric(num) Then
If num > 0 And num < 31 Then
j = CLng(num) + 10
TransferData i, j
End If
End If
Next a
End Sub
Sub TransferData(ByVal i As Long, ByVal j As Long)
With Sheet4
.Cells(15 + i, 3).Value = Sheet2.Cells(j, 1).Value
.Cells(17 + i, 3).Value = Sheet2.Cells(j, 2).Value
.Cells(16 + i, 6).Value = Sheet2.Cells(j, 3).Value
'・
'・
End With
End Sub
この回答への補足
Wendy02 さん いつも有難う御座います。
masa pee さんへのお礼にも書かせてもらいましたが、無事に解決いたしました。
プログラム改修したり、皆さんへのお礼・補足をしたり、電話がかかって来たりで
今へとへとです。 で、これから少しの間だけ外出しないと・・。
改めて、Wendy02 さんのコードを確認させて頂いた上で、Wendy02 さんへのお礼と、
皆さんへのポイントをつけてから締め切りたいと思います。
解決したからといって、Wendy02 さんのご回答を見ないのは失礼と考えますので・・。
有難う御座いました。
補足の後、急遽用事が入り、時間が取れなくなりましたので、Wendy02 さんのご回答を最後まで確認出来なくなりました。(本日)
時間がないので、取りあえず、Wendy02 さんのコードをコピーしただけでは、
With Sheet4
.Cells(15 + i, 3).Value = Sheet2.Cells(従業員番号, 1).Value 'ここでエラー発生 多分私の記述位置ミスか、なにか?
.Cells(17 + i, 3).Value = Sheet2.Cells(従業員番号, 2).Value
.Cells(16 + i, 6).Value = Sheet2.Cells(従業員番号, 3).Value
・
・
・
End With
ですが、
>Sub TransferData(ByVal i As Long, ByVal j As Long)
への記述など、参考になりそうです。 勉強致します。
中途半端な感じになってしまい申し訳ありませんが、今回はここで締め切らせてもらいます。
ほんとに今ちょっと急いでいるんです。
また疑問があったら質問させて頂きますので、その際にはまた、宜しくお願い致します。
No.7
- 回答日時:
#6の訂正と追加です。
[訂正]
誤: * エラーは常にこるのか、特定のコンボボックスで起きるのか
正: * エラーは常に起こるのか、特定のコンボボックスで起きるのか
[追加]
エラーが起きたとき、実際の値と期待している値は同じか。違うなら何が入って欲しいのか教えてください。
[確認]
#5の補足で「作業員名簿」は「従業員番号」の間違い?これまで作業員名簿の話は出てなかったので質問とどう関連するのかわからない。
masa pee さんのNo.6のお礼にも書かせてもらいましたが無事解決致しました。
( プログラム改修に没頭している内に、さらにご回答がNo.8のWendy02 さんまで増えていてびっくり!)
補足してから自分でも言葉が足らなかったと気が付きましたが
「作業員名簿」はSheet4のシート名というか、貼付先の作成する表?の名前です。
貼り付ける際に貼り付ける欄(行)を変数iで指定しているので・・。
「作業員番号」はVBA上での記述の際の変数名。
貼り付ける、という表現も違うかな・・。う~ん、国語力不足?
有難う御座いました。
No.5
- 回答日時:
? CLng("111" & "10")
11110
? CLng("111") + 10
121
他には、
? Val("111" & "10")
11110
? val("111") + 10
121
など使えます。
※左辺と右辺の型は合わせる必要があります。
再度のご回答有難うございます。
#4さんに補足しましたが、ComboBox1~30 を順に指定していく箇所でつまづきました。
ConboBox の1、2、3、~30 を a で代入するには左辺=右辺の記述のどこに気を付ければよいのでしょう?
作業員名簿=????ComboBox????
あるいは作業員名簿をアルファベットにする・・?
個人的には 作業員名簿 に問題でなくて、ComboBox と a をどうつなぐか、と思っていますが・・。
No.4
- 回答日時:
> メッセージボックス( OkOnly )が3回表示されておしまいでした・・。
はいその通りです。質問としてはFor文の中でコンボボックスを指定したいということだったのでそう書きました。いきなりいろいろ書いてしまうとエラーの原因がわかりにくくなるので単純にしました。テストは単純なことから始めないとはまります。
#1の補足についてですが、コード全体を見ていないので推測で答えます。今回の原因になりそうなのは
1. 文字と数字を足し算しようとしている
2. 代入しようとしている値と変数の型が合わない
のどちらかでしょう。
エラーが起きたとき、コンボボックスのTextには何が入っているのか。足し算は正確に行われているか。代入のときの型があっているか、を確認してください。やり方がわからなければ補足ください。
この回答への補足
'1人目データの貼り付け
If ComboBox1.Text = "" Then GoTo 2
If ComboBox1.Text < 1 Or ComboBox1.Text > 30 Then
GoTo case1 '行き先は「1~30の範囲の整数を入力下さい。」旨のMsgBoxです。
End If
従業員番号 = UserForm1.ComboBox1.Text + 10
i = 0
With Sheet4
.Cells(15 + i, 3).Value = Sheet2.Cells(従業員番号, 1).Value
・
・
・
End With
2: '2人目データの貼り付け
If ComboBox2.Text = "" Then GoTo 3
If ComboBox2.Text < 1 Or ComboBox2.Text > 30 Then
GoTo case1
End If
従業員番号 = ComboBox2.Text + 10
i = 4 'i=4←sheet4(作業員名簿)1人目の欄から4行下が2人目の欄
With Sheet4
.Cells(15 + i, 3).Value = Sheet2.Cells(従業員番号, 1).Value
・
・
・
End With
3: '3人目データの貼り付け
・
・
以下10:まで続く
と記述していて問題なく使えました。
ただ、人数を30人にする必要になったのですが、このまま30:まで記述すると64kを超えてしまいます。
で、For to Next 文を使ったところ、ComboBox の指定でつまづいた次第です。
No.3
- 回答日時:
Private Sub CommandButton1_Click()
Dim I As Integer
For I = 1 To 3
MsgBox UserForm1.Controls("ComboBox" & Trim(Str$(I))).Text & "10"
Next I
End Sub
一応、これで ComboBox1、ComboBox2、ComboBox3 のテキストは表示されます。
ご回答有難うございます。
>For I = 1 To 3
>MsgBox UserForm1.Controls("ComboBox" & Trim(Str$(I))).Text
>Next I
ご回答のとおり、ComboBox1~3 のテキスト表示は確認出来ました。
ですが、MsgBox の記述では"CombBox" でエラーになりませんが、
質問で述べたVBAの従業員番号= の箇所に代入すると「型が一致しません」エラーになります。
従業員番号 = UserForm1.Controls("ComboBox" & Trim(Str$(a))).Text + 10
"ComboBox" が文字列型、I が整数型と認識されるからか・・
"" を外すと「指定されたオブジェクトは見つかりません」エラーが返ります。
型宣言しても、しなくとも一緒です。
For To Next 文でコントロールの指定は無理ですか?
No.2
- 回答日時:
'ComboBox1~ComboBox3のTextプロパティを表示
For a = 1 To 3
MsgBox UserForm1.Controls("ComboBox" & a).Text
Next
これで値が確認できると思います。こちらはExcel2000で確認。バージョン違いで動かなかったらごめんなさい。
ご回答有難うございます。
>For a = 1 To 3
>MsgBox UserForm1.Controls("ComboBox" & a).Text
>Next
メッセージボックス( OkOnly )が3回表示されておしまいでした・・。
質問で言い忘れてましてすみません。XP Excel2003 です。
No.1
- 回答日時:
従業員番号=UserForm1.Controls("ComboBox" & a).Text+10
ではどうか?(未確認)
ご回答有難うございます。
>従業員番号=UserForm1.Controls("ComboBox" & a).Text+10
「型が一致しません」エラーが返ります。
="○○○○" + a や ="○○○" & a も同エラーです。
文字列型や整数型を一緒に記述しない事、の意味と考えています。
( 試しに型宣言しても、型宣言しなくとも同エラーになります。)
=UserForm1.Controls(ComboBox & a).Text+10 と""を外すと今度は
「指定されたオブジェクトは見つかりません」エラーが返ります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) なぜExit Subがあるのかわかりません 4 2023/02/19 12:34
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) 3個のfileのセルデータを1個のfileのセルに貼り付けるVBAコードですが。 1 2023/02/20 09:21
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) VBAでのループ順序について 3 2023/03/13 10:55
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
コンボボックス内の文字サイズ変更
Excel(エクセル)
-
フォームを開くときに、コンボボックスの値を選択(アクセスVBA)
Visual Basic(VBA)
-
テキストボックスの番号を使ったFor~Next文について
Visual Basic(VBA)
-
-
4
Access サブフォームでの選択行の取得
その他(データベース)
-
5
ユーザーフォームを表示中にシートの操作をさせるには
Excel(エクセル)
-
6
他のフォームから別のフォームのサブルーチンを呼び出す
Visual Basic(VBA)
-
7
VBAでユーザーフォームを再表示させたい。
Excel(エクセル)
-
8
VBA:ユーザーフォームのマルチページに色を付けたい。
Word(ワード)
-
9
コンボボックスの文字によるif文の作成
Visual Basic(VBA)
-
10
VBA コンボボックスで選んだ値を取得するには
その他(Microsoft Office)
-
11
Access サブフォームでの複数行選択
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
首吊りどこ締めるの
-
白血球が多いとどんな心配があ...
-
ある範囲のセルから任意の値を...
-
検便についてです。 便は取れた...
-
彼女のことが好きすぎて彼女の...
-
精液の落とし方を教えてください
-
Excelで""で囲む方法
-
2つの数値のうち、数値が小さい...
-
甲状腺が腫れているが血液検査...
-
EXCELで条件付き書式で空白セル...
-
精子が黄色?
-
勃起する時って痛いんですか? ...
-
エクセル指定した範囲からラン...
-
Excel 0目標に対して数字があ...
-
値が入っているときだけ計算結...
-
アクエリアスが苦く感じる
-
リンク先のファイルを開かなく...
-
小数点以下を繰り上げたものを...
-
EXCELで式からグラフを描くには?
-
これって喉仏ですか? 私は女性...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
首吊りどこ締めるの
-
白血球が多いとどんな心配があ...
-
検便についてです。 便は取れた...
-
勃起する時って痛いんですか? ...
-
彼女のことが好きすぎて彼女の...
-
腕を見たら黄色くなってる部分...
-
精子が黄色?
-
EXCELで条件付き書式で空白セル...
-
至急!尿検査前日にオナニーし...
-
これって喉仏ですか? 私は女性...
-
中出しをするとお腹が痛い・・・。
-
甲状腺が腫れているが血液検査...
-
2つの数値のうち、数値が小さい...
-
尿検査前日に自慰行為した時の...
-
EXCELで式からグラフを描くには?
-
小数点以下を繰り上げたものを...
-
ある範囲のセルから任意の値を...
-
口の中に黒い血の塊
-
【Excelで「正弦波」のグラフを...
-
エクセル指定した範囲からラン...
おすすめ情報