• ベストアンサー

エクセルVBA ユーザーフォームからシートの操作

エクセルでユーザーフォームを用いて 顧客管理データーベース入力フォームを作成しています。 ユーザーフォーム上で入力した値を複数のシートに またがってデーターを入力していくつもりです。 それで困っていることなのですが、 ユーザーフォームを起動したときに、それぞれの シートの空白の場所を変数で記憶させているのですが 以下に示す部分でエラーが発生します。 エラーの原因は、アクティブシートでないので セルを取得できないようなのですが、アクティブでない 場合の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.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
tmgolf
質問者

お礼

補足と解説を丁寧にしていただいてありがとう ございます。ご指摘の通り、sheetのsが小文字 だったためでした(汗) 解説の方もとても丁寧にしていただき、誠に ありがとうございます。また、URLもつけて いただきありがとうございます。 とても勉強になりました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答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 ローカル変数とモジュールスコープの変数の名前は、別にしたほうがよいです。コードは、問題のないほうを使ってください。上から下がる方法と下から上がる方法のどちらかです。ローカルモジュールでも可能です。

tmgolf
質問者

お礼

ご返答ありがとうございます。 コードの方、ありがとうございます。 こちらのコードも参考にこれからも 勉強させていただきます。 ありがとうございます。

回答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

tmgolf
質問者

補足

ご返答ありがとうございます。 コードを試しているのですが。 [sheet1]が見つかりません。 [sheet2]が見つかりません。 と出てきます。 <<If WSh.Name = wshName Then のところで、変数を確認したのですが WSh.Name="sheet1" wshName="sheet1" となっていました。 <<If WSh Is Nothing Then のところで WShは変数が無いようなのですが、 「If WSh Is Nothing Then」 どう言う動きになっているのか理解しきれて いないもので、補足していただけないでしょうか。 宜しくお願いいたします。

  • ASIMOV
  • ベストアンサー率41% (982/2351)
回答No.1

標準モジュールに記述すれば、エラーにならないと思いますが...

tmgolf
質問者

補足

お返事ありがとうございます。 標準モジュールに記述と言うことなのですが、 ユーザーフォームを操作している時に 実行していきたいのですが、標準モジュールへの記述でも 良いのでしょうか? まだ、VBAを勉強しだして半年ほどなので、記述場所や変数 の宣言場所、有効期間等など理解しきれていないので。 ユーザーフォーム実行中にVBAを動かしていくには、ユーザー フォームにコードを記述していくものだと思っているのですが。 標準モジュールで大丈夫なのでしょうか?

関連するQ&A

  • エクセルでプロシージャが終了しません。

    ユーザーフォームのボタンをクリックしたら、特定のセルに現在の時刻を入力するマクロを作っています。 入力するところまではうまくいったのですが、プロシージャが終了しないので保存することができません。 どこが違うのかわからないので、わかる方よろしくお願いいたします。 Private Sub cmd1_Click() Dim hiduke As Date Dim hiduke2 As Integer hiduke = Now() hiduke2 = CInt(Day(hiduke)) If chk1.Value = True Then Cells(4, 1).Select Do Until ActiveCell.Value = hiduke2 ActiveCell.Offset(1, 0).Select Loop ActiveCell.Offset(0, 2).Value = hiduke Else Cells(4, 1).Select Do Until ActiveCell.Value = hiduke2 ActiveCell.Offset(1, 0).Select Loop ActiveCell.Offset(0, 8).Value = hiduke End If End Sub

  • VBAでフォームからシートへ入力

    シートが「回答フォーム」と「用語」と言うのがあります。 (1)「回答フォーム」シートに"入力"ボンタをクリックすると「用語」のシートに入力される。 (2)回答フォーム」シートに"検索"ボンタをクリックすると「用語」のシートからフォームへ表示される。 用語のシートに項目は、A列から、ナンバー、検索、フリガナ、用途、用語、意味とあります。 TextBox1に用語、TextBox2に用途、TextBox3に意味 とあります。 (1)には Private Sub 入力_Click()   Sheets("用語").ActiveSheet・・・ここがエラーになります。 「オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 行 = ActiveCell.Row 列 = ActiveCell.Column Cells(行, 列) = UserForm1.TextBox1.Value Cells(行, 列 + 1) =UserForm1.TextBox2.Value   Cells(行, 列 + 2)=UerForm1.TextBox3.Value UserForm1.TextBox1.SetFocus Cells(行 + 1, 列).Select End Sub (2)には Private Sub CommandButton1_Click() Set sh1 = bk.Worksheets("回答フォーム") Set sh5 = bk.Worksheets("用語") cnt1 = 2 UserForm1.TextBox1.Value・・・・ここのVALUEがエラーになります。 「コンパイルエラー プロパティの使い方が不正です。」 ActiveCell.FormulaR1C1 = "=MATCH(RC[-1],用語!C[-5],0)" n = ActiveCell.Value '用語 sh5.Cells(n, 2).Value = sh1.TextBox1.Value '意味 sh5.Cells(n, 3).Value = sh1.TextBox3.Value '用途 sh5.Cells(n, 4).Value = sh1.TextBox2.Value End Sub 申し訳ないですがよろしくお願い致します。

  • Excel ユーザーフォームの入力値をシートに転記

    Excelでユーザーフォームを作りました。 ユーザーフォームには、テキストボックスを2個、ボタンを1個("記入"という文字が入っています)置いてあります。 テキストボックスに入れた数値をSheet1のセル"C24","C25"に転記したいので、ユーザーフォームのコードを次のようにしましたが、エラーメッセージは出ないかわりに何も動いてくれません。 「どこ」と「なに」が違いどうするのが正しいのか教えて下さい。よろしくお願いします。 Private Sub Tbox1_Change() a = Tbox1.Value End Sub ---------------------------- Private Sub Tbox2_Change() b = Tbox2.Value End Sub ---------------------------- Sub 記入Button_Click() '入力値をSheet1に転記 Dim a As Range Dim b As Range Sheets("Sheet1").Select Set a = Range("C24") Set b = Range("C25") End Sub

  • VBA エクセル 実行時エラー13:型が一致しません

    またまたお世話になります。 下記のマクロを走らせると、タイトルのようなエラーメッセージが出てしまいます。 Sub rows_hdn() Dim n As Integer Sheets("ABC").Select n = 3 Do Until Cells(n, 2).Value = "" n = n + 1 Loop Sheets("EFG").Select If n <> 3 Then Rows("3:n-1").Select Selection.EntireRow.Hidden = True End If End Sub シートABCに入力がされているライン数だけ、シートEFGの3行目から隠したいのですが、どのようにすればよろしいのでしょうか? よろしくお願いいたします。

  • ユーザーフォームからワークシートへの転記について

    ●質問の主旨 エクセルVBAの初心者です。 添付画像のユーザーフォームからデータベースへの転記の コードを記述しましたが、実行しようとすると15行目の「CelData」のところが 選択され、コンパイルエラー(変数の定義がされていません) が返されます。 1.「CelData」のコンパイルエラーはどのように修正すれば   よいでしょうか? 2.またこのコンパイルエラーを修正すれば、ユーザーフォームから   ワークシートへの転記ができるでしょうか? ●質問の補足 1.ユーザーフォームにある「入力No.」と 「入力日」(赤色で囲った部分)をそれぞれ A2セル、B2セル(青色で囲った部分)に転記しようと 考えています。 2.添付画像のワークシートには手入力で「柴田8月分」 というシート名が予めつけられています。 3.ユーザーフォームやワークシートには 他に入力、転記する個所がありますが質問を 簡単にするため省略しています。 4.この質問に関するオブジェクト名は以下の 通りです。 ・「入力No.」=TextBox3 ・「入力日」=txtdate ・「データベース入力」=CommandButton3 エクセルVBAにお詳しい方ご教示願います。 使用機種はWindows Vista Excel2007です。 なお、コードは以下の通りです。 1 Option Explicit 2 'ユーザーフォームの初期化 3 Private Sub UserForm_Initialize() 4 TextBox3.Value = 1 5 txtdate = Date 6 End Sub 7 'ユーザーフォームからデータベースへの転記 8 Private Sub データベース入力_Click() 9 Dim RowPos As Integer 10 Dim ColPos As Integer 11 RowPos = 2 12 ColPos = 1 13 Do 14 RowPos = RowPos + 1 15 CelData = Worksheets("柴田8月分").Cells(RowPos, _ 16 ColPos) 17 Loop While CelData <> "" 18 With Worksheets("柴田8月分") 19 .Cells(RowPos, ColPos) = TextBox3.Value 20 .Cells(RowPos, ColPos + 1) = txtdate.Value 21 End With 22 End Sub

  • Excel VBA セルの指定の方法

    VBAの初心者です。処理1 のサブルーチンを使わずに直接記述すれば、エラーはでませんが、以下のように記述すればエラーが出てしまいます。宜しくお願いします。 Sub Macro10() i = 1 Do Until Cells(i, 1) = "" 処理1 i = i + 1 Loop End Sub Sub 処理1() Cells(i, 2).Select  ← ここでエラーになります。        ActiveCell.FormulaR1C1 = "◎" End Sub

  • マクロのユーザーフォームについて(エラー)

    現在、エクセルのマクロ・ユーザーフォームを使って書式を作っています。 ユーザーフォームを幾つか使っているのですが、ある一つのフォームを開こうとするとそれだけ”インディックスが有効範囲にありません。”とエラーが出ます。 他のフォームと構文の内容はほぼ同じなのですが、それだけ開かないのです。どこが間違っているのか、教えていただけないでしょうか? ■ユーザーフォーム2からユーザーフォーム7を開きたい■ -----ユーザーフォーム2の構文----- Private Sub CommandButton2_Click() '出張期間を閉じて業務内容を開く Unload UserForm2 Dim myRow As Long Dim myMaxNo As Integer   myRow = 12 myMaxNo = Worksheets("規定").Range("E25").Value Do Until Cells(myRow, 22) = "" myRow = myRow + 1 Loop If (myRow - 12) >= myMaxNo Then MsgBox "入力できる件数を超えています。" Else UserForm7.Show ※←ここで止まってしまいます。 End If End Sub

  • エクセルユーザーフォームで困ってます。

    エクセル初心者です。 自分のユーザーフォーム(住所、商品登録)を作りたくて大変困ってます。 下記は、ネットなどをみて貼り付けたのですが、上手くいきません。 まずTOPページを作り、ユーザーフォームを呼び出すボタンを作り、クリックすると フォームが出るようにしてあります。 そこに、自分の入力したいものをユーザーフォームにテキストでつくり、シート9に 登録ボタンを作りクリックしたら、シートに反映させたいと思ってます。 登録ボタンを押したら、入力画面はクリアにしたいです。 他にいろいろやりたい事もあるのですが、入力した順番に001・002・003と顧客番号をつけたり 検索ボタンを作って、名前や、顧客番号を入れると情報を呼び出したり、請求書用のプリントシートや、封筒シートに簡単に反映できればと思っています。 しかし、まだまだそこまではいかず、最初でつまずいてます。 現状は、フォームを呼び出すときに実行時エラーがでます。 どうしても、自分の使い勝手のいいものを作りたいので どうか、助けてください。大変まいってます。 長文になりますが、どうかよろしくお願いします。 下記の入力中のものをみていただけて、いろいろ意見をいただけるとありがたいです。 Sub FormShow() UserForm1.Show End Sub 'Sheet9へ書き込む Private Sub 登録_Click() Dim i As Integer With Worksheets(9) 'テキストボックスの値を書き出し For i = 1 To 80 .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text Next End With End Sub 'Formを呼び出したとき、Sheet9から読み込む Private Sub UserForm_Initialize() Dim i As Integer With Worksheets(9) 'テキストボックスの値を読み込み For i = 1 To 80 UserForm1.Controls("TextBox" & i).Text = .Range("B" & i) Next End With End Sub '終了ボタン Private Sub CommandButton2_Click() Unload Me End Sub

  • エクセルマクロ・ユーザーフォームの初期設定

    マクロのユーザーフォームを使って、書式を作っています。 ユーザーフォームを開くと、自動的にシリアルナンバーが出るようにしたいのですが、出てきません。 どのように訂正すれば宜しいでしょうか? ※マクロのテキストを元に、値のみ変更して入力しています。 -----Private Sub UserForm7_Initialize()----- Dim myRow As Long '行番号の変数 Dim mySno As Integer '登録開始番号の変数 Dim myMaxNo As Integer '最大登録件数の変数 With Worksheets("規定") '規定'シートで担当者の入力が始まる行 myRow = 4 '登録開始番号と最大登録件数をセット mySno = 1 myMaxNo = 4 '担当者データを読み込みコンボボックスに登録 Do Until .Cells(myRow, 2).Value = "" omboBox1.Value.AddItem .Cells(myRow, 2).Value myRow = myRow + 1 Loop End With '「精算書」シートの1件目の行番号をセット myRow = 12 '「精算書」データシートの登録No.の新規入力行を求める。 Do Until Cells(myRow, 22).Value = "" myRow = myRow + 1 Loop '登録No.テキストボックスに新規の番号をセット TextBox1.Value = mySno + myRow - 12 ----End Sub------

  • EXCEL VBAのユーザーフォームに引数を渡す方法について

    すいません、EXCEL VBAのユーザーフォームに引数を渡す方法についてご質問があります。 シート上にコマンドボタンを2つ用意する。 コマンドボタン1を押すと変数mは1 コマンドボタン2を押すと変数mは2 としてユーザーフォームを呼び出す。 Public m As Integer Private Sub CommandButton1_Click()  m = 1  Call フォーム呼び出し(m) End Sub Private Sub CommandButton2_Click()  m = 2  Call フォーム呼び出し(m) End Sub Sub フォーム呼び出し(m As Integer)  UserForm1.Show End Sub 次にユーザフォームにコマンドボタンを1個置き、 ボタンを押したとき、mが1であれば「ボタン1」 mが2であれば「ボタン2」 とメッセージボックスを出し、ユーザーフォームを閉じる。 Private Sub CommandButton1_Click()   If m = 1 Then    MsgBox "ボタン2"   ElseIf m = 2 Then    MsgBox "ボタン2"   End If  Unload UserForm1 End Sub プロシージャ間の引数渡しは色々なテキストに載っているのですが ユーザーフォームに引数を渡す方法はどうも見つからず、 Private Sub CommandButton1_Click(m) としても、コンパイルエラーとなってしまいます。 よろしくご教示をお願いいたします。

専門家に質問してみよう