エクセルでユーザーフォームを用いて
顧客管理データーベース入力フォームを作成しています。
ユーザーフォーム上で入力した値を複数のシートに
またがってデーターを入力していくつもりです。
それで困っていることなのですが、
ユーザーフォームを起動したときに、それぞれの
シートの空白の場所を変数で記憶させているのですが
以下に示す部分でエラーが発生します。
エラーの原因は、アクティブシートでないので
セルを取得できないようなのですが、アクティブでない
場合のselectに変わるやり方ってありませんか?
-----sheet1がアクティブな状態で--------------------------------
Dim myRowNo As Integer
Dim myRowNoS As Integer
---------------------------------------------------------------
Private Sub MyRowNo1()
myRowNo = 4
Sheets("sheet1").Cells(myRowNo, 1).Select
Do Until ActiveCell.Value = ""
myRowNo = myRowNo + 1
Sheets("sheet1").Cells(myRowNo, 1).Select
Loop
End Sub
----------------------------------------------------------------
Private Sub MyRowNo2()
myRowNoS = 4
Sheets("sheet2").Cells(myRowNoS, 1).Select <<<<<<<<エラー箇所
Do Until ActiveCell.Value = ""
myRowNoS = myRowNoS + 1
Sheets("sheet2").Cells(myRowNoS, 1).Select
Loop
End Sub
---------------------------------------------------------------
Private Sub OpenButton2_Click() 'ユーザーフォームボタンをクリック
Call MyRowNo1
Call MyRowNo2
End Sub
---------------------------------------------------------------
MyRowNo1と2の間に「Worksheets("sheet2").Select」を入れる
と動くようなのですが、呼び出さずに動かす方法ってありますか?
宜しくお願いいたします。
No.1
- 回答日時:
標準モジュールに記述すれば、エラーにならないと思いますが...
この回答への補足
お返事ありがとうございます。
標準モジュールに記述と言うことなのですが、
ユーザーフォームを操作している時に
実行していきたいのですが、標準モジュールへの記述でも
良いのでしょうか?
まだ、VBAを勉強しだして半年ほどなので、記述場所や変数
の宣言場所、有効期間等など理解しきれていないので。
ユーザーフォーム実行中にVBAを動かしていくには、ユーザー
フォームにコードを記述していくものだと思っているのですが。
標準モジュールで大丈夫なのでしょうか?
No.2
- 回答日時:
今のソースコードでは、sheet2 をアクティブにしないとエラーとなってしまいます。
アクティブにする必要がないのであれば、以下のコードでどうでしょうか。
Private myRowNoS As Long
Private Sub testcall()
Call MyRowNoXXX("sheet1")
Call MyRowNoXXX("sheet2")
End Sub
Private Sub MyRowNoXXX(ByVal wshName As String)
Dim WSh As Worksheet
myRowNoS = 4
'仕様によっては、ワークブックの検索も必要です。
For Each WSh In ActiveWorkbook.Worksheets
If WSh.Name = wshName Then
Exit For
End If
Next WSh
If WSh Is Nothing Then
MsgBox "ワークシート[" & wshName & "]が見つかりません。", _
vbCritical + vbOKOnly
Exit Sub
End If
Do Until WSh.Cells(myRowNoS, 1) = ""
myRowNoS = myRowNoS + 1
Loop
Set WSh = Nothing
MsgBox "未入力は" & Format(myRowNoS) & "行目です。", _
vbInformation + vbOKOnly
End Sub
この回答への補足
ご返答ありがとうございます。
コードを試しているのですが。
[sheet1]が見つかりません。
[sheet2]が見つかりません。
と出てきます。
<<If WSh.Name = wshName Then
のところで、変数を確認したのですが
WSh.Name="sheet1"
wshName="sheet1"
となっていました。
<<If WSh Is Nothing Then
のところで
WShは変数が無いようなのですが、
「If WSh Is Nothing Then」
どう言う動きになっているのか理解しきれて
いないもので、補足していただけないでしょうか。
宜しくお願いいたします。
No.3
- 回答日時:
こんにちは。
Select するからエラーが出るわけです。その前に、Sheet をアクティブにしないといけません。それと、わざわざ、ご丁寧にPrivate ステートメントを入れているようですが、ローカルモジュールに入れる必要はありませんね。
Dim myRowNo As Long
Dim myRowNoS As Long
Sub GetRowSheetCol_A()
Dim i As Long
i = 4
myRowNo = Worksheets("Sheet1").Cells(i, 1).End(xlDown).Row + 1
' myRowNo = Worksheets("Sheet1").Cells(65536, 1).End(xlUp).Row + 1
myRowNoS = Worksheets("Sheet2").Cells(i, 1).End(xlDown).Row + 1
' myRowNoS = Worksheets("Sheet2").Cells(65536, 1).End(xlUp).Row + 1
MsgBox myRowNo & ", " & myRowNoS
End Sub
ローカル変数とモジュールスコープの変数の名前は、別にしたほうがよいです。コードは、問題のないほうを使ってください。上から下がる方法と下から上がる方法のどちらかです。ローカルモジュールでも可能です。
ご返答ありがとうございます。
コードの方、ありがとうございます。
こちらのコードも参考にこれからも
勉強させていただきます。
ありがとうございます。
No.4ベストアンサー
- 回答日時:
tmgolf さま
Call MyRowNoXXX("XXX") 内のXXXはワークシート名称です。
アクティブになっているワークブック内にXXXが含まれない
場合、メッセージが表示されるようにしています。
大文字、小文字の区別があるので、おそらく新規ワークブック
でテストされ、シート名称がSheet1、Sheet2のSが大文字の
シート名称でテストされていないでしょうか?
再度確認してみて下さい。
下記に先程の回答にコメントを追加しました、わかりやすく
記述したつもりですが、一部どうしても代替できない部分が
ありました。
意味が理解できない単語がありましたら、ネットの辞書で検索
されると私が説明するよりも正しく詳しく記載されています。(笑
Private myRowNoS As Long
Private Sub testcall()
Call MyRowNoXXX("sheet1")
Call MyRowNoXXX("sheet2")
End Sub
Sub MyRowNoXXX(ByVal wshName As String)
'現在アクティブになっているワークブック内の
'ワークシートクラスを一時的に格納するための
'宣言
'クラスについての詳しい説明は避けますが、
'簡単にいうと、データとメソッド(関数、プロシージャ)を
'ひとまとめにし、再利用するための雛形です。
'詳しい内容については、少しずつネット又は書籍で
'知識を深めて下さい。
Dim WSh As Worksheet
'ここは現在作成中の処理の仕様に基づき適切な
'処理を記述して下さい。
myRowNoS = 4
'現在アクティブになっているワークブック内の
'全てのワークシート数分ループを繰り返します。
'同時に、WSh変数に対しワークシートクラスを
'順に割り当てます。
'仮に、Sheet1、Sheet2を含むワークブックの場合、
'ループは2回発生します。
For Each WSh In ActiveWorkbook.Worksheets
'ワークシート名称を判定し、引数で指定された
'ワークシート名称と完全一致するかを判定します。
If WSh.Name = wshName Then
'ワークシート名称と完全一致した場合ループ
'処理を抜けます。
Exit For
End If
Next WSh
'以下の判定は、ループ内で行われた、ワークシート
'名称の判定処理において、一度も一致しなかった場合、
'メッセージを出力するようにしています。
'上記のループで一致する場合は、途中でループ処理を
'抜けるため、wshName に格納されたシート名称を持つ
'ワークシートクラスのインスタンスが格納されている
'ため、WSh は解放された状態(Nothing)になりません。
If WSh Is Nothing Then
MsgBox "ワークシート[" & wshName & "]が見つかりません。", _
vbCritical + vbOKOnly
Exit Sub
End If
Do Until WSh.Cells(myRowNoS, 1) = ""
myRowNoS = myRowNoS + 1
Loop
'一時的に使用したオブジェクト変数の解放
Set WSh = Nothing
MsgBox "未入力は" & Format(myRowNoS) & "行目です。", _
vbInformation + vbOKOnly
End Sub
参考URL:http://e-words.jp/p/c-programming-object.html
補足と解説を丁寧にしていただいてありがとう
ございます。ご指摘の通り、sheetのsが小文字
だったためでした(汗)
解説の方もとても丁寧にしていただき、誠に
ありがとうございます。また、URLもつけて
いただきありがとうございます。
とても勉強になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) vbaのvlookup関数エラー原因を教えていただけないでしょうか。 3 2022/04/25 16:16
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでブック内の倍率がバ...
-
EXCELで複数のシートを一度に「...
-
特定のシートのみ再計算させな...
-
エクセルで複数のシートに画像...
-
エクセル シート同士の引き算
-
SUMIF関数【複数のシート...
-
エクセルのシー名を二段表示に...
-
EXCELの「シートの見出し」のフ...
-
エクセル シートのグループ化...
-
アクセスからエクセルのシート...
-
エクセルの2つのシートを並び...
-
エクセルでシート数が分からな...
-
複数シートの選択解除の方法
-
Excelでの複数シートにまたがる...
-
ワークシートそのものの色を変...
-
DATE関数 4月31日などのあ...
-
エクセルでリンク貼り付けした...
-
エクセルのシートが消えた
-
Accessのテーブルを既存のExcel...
-
エクセル、別のシートの表をポ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELで複数のシートを一度に「...
-
エクセルで複数のシートに画像...
-
特定のシートのみ再計算させな...
-
エクセルでブック内の倍率がバ...
-
ワークシートそのものの色を変...
-
【ExcelVBA】マクロの入ったシ...
-
エクセルの2つのシートを並び...
-
EXCELの図形(テキストボックス)...
-
ハイパーリンクでジャンプした...
-
エクセルのシート連番の振り直し
-
特定の複数のシートに同じ処理...
-
エクセルのシー名を二段表示に...
-
Wordで差し込み印刷時に表示す...
-
エクセルで、シートの名前を変...
-
エクセルでリンク貼り付けした...
-
エクセル、特定のシートにパス...
-
accessへエクセルの複数のシー...
-
Accessのテーブルを既存のExcel...
-
【Excel VBA】データ貼り付け先...
-
EXCELの「シートの見出し」のフ...
おすすめ情報