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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/27 00:40

こんにちは。



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

ローカル変数とモジュールスコープの変数の名前は、別にしたほうがよいです。コードは、問題のないほうを使ってください。上から下がる方法と下から上がる方法のどちらかです。ローカルモジュールでも可能です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/06/27 00:42

今のソースコードでは、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」
どう言う動きになっているのか理解しきれて
いないもので、補足していただけないでしょうか。
宜しくお願いいたします。

補足日時:2007/06/26 15:28
    • good
    • 0

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

この回答への補足

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

補足日時:2007/06/26 15:22
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォーム御礼とは何ですか?

こんにちは。
あるブログで「フォーム御礼」という言葉を見かけましたが、どういう意味でしょうか?教えてください。

Aベストアンサー

そのブログサイトに設置されているメールフォームなどから
送られてきたブログ閲覧者からのメッセージに対する
ブログ管理者のお礼ではないでしょうか。

QEXCEL VBAのユーザーフォームの操作方法について教えていただきたいことがあります

EXCEL VBAのユーザーフォームの操作方法について教えていただきたいことがあります。

(1)ユーザーフォームにテキストボックスを2つ作る
(2)コマンドボタンを1つ作る。

この場合に、コマンドボタンを押すと、セットフォーカスされている方のテキストボックスに「新春」と表示させることはできるのでしょうか。
キーボードは当然セットフォーカスされているテキストボックスに入力されますが
それと同じ機能をコマンドボタンにも持たせたいのです。

Private Sub CommandButton1_Click()

TextBox1がセットフォーカスされているならTextBox1に"新春"と入力する
TextBox2がセットフォーカスされているならTextBox2に"新春"と入力する
というような条件式になるのでしょうか。

色々調べましたが答えが見当たりません。
よろしくお願いいたします。

Aベストアンサー

こんな感じ。

下記は、ActiveControl が TextBox ならばテキストを記入しますが、
ある特定の TextBox などとしたい場合は、

  If ActiveControl.Name = "TextBox1" Then

などと判定してもよろしいかと。

Private Sub UserForm_Initialize()
  ' // CommandButton にフォーカスを移さない
  ' // 移ると ActiveControl が CommandButton1 に
  ' // なってしまうので
  Me.CommandButton1.TakeFocusOnClick = False
End Sub

Private Sub CommandButton1_Click()
  Dim c As Control
  Set c = ActiveControl
  If TypeOf c Is MSForms.TextBox Then
    ' // ActiveControl が TextBox ならば
    c.Text = "新春"
  End If
  Set c = Nothing
End Sub

こんな感じ。

下記は、ActiveControl が TextBox ならばテキストを記入しますが、
ある特定の TextBox などとしたい場合は、

  If ActiveControl.Name = "TextBox1" Then

などと判定してもよろしいかと。

Private Sub UserForm_Initialize()
  ' // CommandButton にフォーカスを移さない
  ' // 移ると ActiveControl が CommandButton1 に
  ' // なってしまうので
  Me.CommandButton1.TakeFocusOnClick = False
End Sub

Private Sub CommandButton1_Click()
  Dim c As Con...続きを読む

Q“フォーム”とは何でしょうか。

“フォーム”というインターネット関連の言葉を最近耳にいたします。

検索を試みましたが、しっくりと理解できません。

特徴を教えていただけないでしょうか。
何ができるのでしょうか。その例を教えていただきたく願います。

Aベストアンサー

「フォーム」とは、データを送信するための窓といったらいいでしょうか。gooでも、検索するときに検索キーワードを入力するボックスがありますよね。それやチェックボックスなんかを総称して「フォーム」と呼びます。

「フォーム」を使えば、ユーザーが任意に選んだ情報をサーバーに送信できるという特徴がありますね。(つまり選択肢のなかから選択といったことが可能になる)

QエクセルVBAをつかってフォルダ内のファイルの特定シートのデータを1つのシートにまとめる

はじめまして。
過去ログ検索しましたが、載っていないようなので投稿させていただきます。

ブックAがあるフォルダ内にある「○年*.xls」のさらに「○月(○月以外のシートもあり)」のシート内の特定のセル(範囲は固定されてます)の文字列を、全てブックAの1つのシートにまとめたいのですが、VBAにてこれは可能ですか?
フォルダ内のファイルが複数だったり、またそのファイル内の該当シートが1つだったり複数だったりで、かなり行き詰ってます。

どなたかご存知の方いらっしゃいましたらご教授願います。
エクセル2000を使用しております。

Aベストアンサー

ANo.4です。

セル範囲とは1セル(1行)だったのですね。
ならばエラーになりますね。
>Set r = r.End(xlDown).Offset(1)
1行ずつ移動させるのでしたら、
Set r = r.Offset(1)
でよろしいかと。

ついでですが、
>If InStr(ws.Name, "*年*月*") Then
で問題は出ていませんか?
こちらではシートを見つけられずデータが貼り付きません。
If InStr(ws.Name, "年") * InStr(ws.Name, "月") Then
このように致しました。

Qメールフォームのソースにある「id="sen"」とは何?

人にもらったメールフォームをカスタマイズしてフォームを作っています。一行のテキスト入力フィールドのソースが以下のようになっています。
<INPUT type="text" size="50" maxlength="50" name="mail1" id="sen">
フィールドは複数あるのですが、どれも「id="sen"」がついていて、これが何を規定しているものかわかりません。html制作はホームページビルダーを使いましたがそのような設定項目はなく、Web制作の本をみても載っていません。なくてもいいものなのか、設定が必要なものなのか、わかる方、教えて下さい。
(私はhtmlを作成し、あとはプログラマに修正してもらうことになっているのですが、そのプログラマの方もよくわからないようです。)

Aベストアンサー

idはスタイルシートやJavaScript、DynamicHtmlで使用される要素です。
そういった類のものがソース内になければ、idは消去しても問題ないはずです。

参考URL:http://www.tohoho-web.com/html/attr/id.htm

Qエクセルについての質問です以下のようなデータ管理表がシート1〜シート2 2つあります。どれも同じ

エクセルについての質問です

以下のようなデータ管理表がシート1〜シート2 2つあります。どれも同じものです。

三菱倉庫
日付 重量 場所

7月1日 10t 倉庫 1
7月2日 10t 倉庫 3
7月2日 5t 倉庫 3
シート1


東芝倉庫
日付 重量 場所

7月1日 10t 倉庫 1
7月2日 13t 倉庫 3
7月2日 5t 倉庫 3
シート2

本日分のデータのみをシート2に反映させたい
ここで言うと三菱倉庫は2回作業計15t。東芝倉庫も同じ2回作業18t。合わせて32t搬出作業を行っており、このデータをシート2以下のようにするにはどうしたらよいのでしょうか?
どなたかご教示ください。マクロでもokです
シート2
倉庫1 倉庫2 倉庫3
32t

エクセルについての質問です

以下のようなデータ管理表がシート1〜シート2 2つあります。どれも同じものです。

三菱倉庫
日付 重量 場所

7月1日 10t 倉庫 1
7月2日 10t 倉庫 3
7月2日 5t 倉庫 3
シート1


東芝倉庫
日付 重量 場所

7月1日 10t 倉庫 1
7月2日 13t 倉庫 3
7月2日 5t 倉庫 3
シート2

本日分のデータのみをシート2に反映させたい
ここで言うと三菱倉庫は2回作業計15t。東芝倉庫も同じ...続きを読む

Aベストアンサー

>合わせて32t

? 33じゃなくて?

で、結果はシート2に出すんですか?するとシート2には東芝倉庫のデータと今日の日付の結果が両方出るんですか?

とりあえず、SUMIFSを足してみました。シート2枚分ならそんなに手間じゃないかと。
シート2のE1から倉庫1が入っているとして

E2=SUMIFS(Sheet1!$B:$B,Sheet1!$C:$C,E$1,Sheet1!$A:$A,TODAY())+SUMIFS(Sheet2!$B:$B,Sheet2!$C:$C,E$1,Sheet2!$A:$A,TODAY())

右にコピー。

※Excelカテゴリで放置している質問をきちんと対応してください。

Q質問フォームからの情報とは

よくホームページなどで、
「ご意見・ご感想はコチラ」のような入力するところがありますが、
(アドレスへ送るのではなく、入力フォームです)
あれは送り元であるこちらの情報、
例えばPCやケータイの何らかの情報も自動的に送られるものなのでしょうか?

同じPCから二度送れば、同じ情報が出て発送者が分かったりするものでしょうか?

Aベストアンサー

そのフォームサービスによって違うと思いますが、IPとHostが分かってしまうものがあります。
そういったものだと同じPC・ケータイからの発信なら分かってしまうでしょう。

Q【Excell VBA】ユーザーフォーム上のスプレッドシートのセルを選択したときのイベント

Excell VBA にて、
ユーザーフォーム(userForm1)に、スプレッドシートを
1)その他のコントロール
2)Microsoft Spreadsheetを追加
によって追加して、
そのspreadSheet1上のsheet1の任意のセル(D:*)をクリックしたとき、その行のD1:D5k一連の値を変数に代入したいのですが、
まず手始めとして、そのセルを選択したときにイベントを発生させたい。
 該当のセルを選択してプロシージャを追加すると
Private Sub Spreadsheet1_BeforeContextMenu( _
ByVal x As Long, _
ByVal y As Long, _
ByVal Menu As OWC11.ByRef, _
ByVal Cancel As OWC11.ByRef _
)
となります。

比較のため
Private Sub Spreadsheet1_SelectionChange(ByVal Target As Range)
  If Target.Address() = "$A$1" Then
    MsgBox "このセルはA1です。"
  End If
End Sub

だと、

Error・・・「コンパイル エラー:
プロシージャの宣言が、イベントまたはプロシージャの定義と一致していません。」

・・・どうすればよいのでしょう。
最終的には、「その行のいくつかの値を変数に代入したい」のですが

Excell VBA にて、
ユーザーフォーム(userForm1)に、スプレッドシートを
1)その他のコントロール
2)Microsoft Spreadsheetを追加
によって追加して、
そのspreadSheet1上のsheet1の任意のセル(D:*)をクリックしたとき、その行のD1:D5k一連の値を変数に代入したいのですが、
まず手始めとして、そのセルを選択したときにイベントを発生させたい。
 該当のセルを選択してプロシージャを追加すると
Private Sub Spreadsheet1_BeforeContextMenu( _
ByVal x As Long, _
ByVal y As Long, _
ByVal Menu A...続きを読む

Aベストアンサー

こんにちは。

Private Sub Spreadsheet1_SelectionChanging(ByVal Range As OWC11.Range)
 With Spreadsheet1
 'クリックしたセルの1行目の値
  MsgBox .Cells(1, Range.Column).Value
 End With
End Sub

QGV-RX26T256HのPCBフォームとは?

http://www.links.co.jp/html/press2/gigabyte_gv-rx26t256h.html
今度、上記サイトのボードを買おうと思っているのですが、PCBフォームの意味が分かりません。
私のPCはマイクロATXなので、もしかしたら使えないのでしょうか?
スペックは
M2A-Vm
AMD DC 5000+
CFD W2U800CQ-1GLZJ PC2-6400 2G
DVD ASUS DRW-2014L1T B BULK
HDD HITATHI GST 160G
M-60BK (ブラック・電源なし)
ZUMAX 400W

宜しくお願いします。

Aベストアンサー

PCBフォームはATX、PCBサイズは175mm×111mm
ざんねんながら ATX仕様ですが PCはマイクロATX無理かと思いますが
上は高さ と 長さ表示です。
ケースによるかな
ついでに言っときますがASUSU とGIGABYTE 相性悪いよ
同メーカー選んだ方が正解ですが

Qエクセルで、顧客別の注文商品リストかから、自動的に別シートの商品別の注文顧客リストを作成したい 具

エクセルで、顧客別の注文商品リストかから、自動的に別シートの商品別の注文顧客リストを作成したい

具体的には、
【シート1】
山田 キャベツ リンゴ
鈴木 ネギ 白菜
石井 リンゴ

↓ 商品名を入力したら、

【シート2】
白菜 鈴木
リンゴ 山田 石井
キャベツ 山田
人参
ネギ 鈴木

このように各商品の列に注文者名が自動記載されるようにしたい。

こんなことが可能でしょうか?
よろしくお願いします。

Aベストアンサー

す、すみません m(_ _)m
=IF(COUNTIF($B$1:$C$3,$E1)<COLUMN(A1),"",INDEX($A$1:$A$3,SMALL(IF($E1=$B$1:$C$3,ROW($A$1:$A$3)),COLUMN(A1))))
[Ctrl]+[Shft] +[Enter] で確定、配列数式。{ }で挟まれる
です。ROWとCOLUMNを間違ってました


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報