ど素人ですので、よろしくお願いいたします。
VBAでユーザーフォームのテキストボックスに入力された数値○○~○○という条件でエクセルのデータをフィルターをかけて検索する構文を書きたいのですが、フォームのコードと標準モジュールのコードをどう繋げたらよいのかわかりません。よろしくお願いいたします。
以下が途中まで書いた構文です。

モジュールコード
Sub 抽出()
Range("a4").AutoFilter field:=1, Criteria1:=">=■1", _
operator:=xlAnd, Criteria2:="<■2"
End Sub

フォームコード
Private Sub 実行_Click()
■1(○○以上の数値が入るテキストボックスの構文)
■2(○○未満の数値が入るテキストボックスの構文)
End Sub

全く違っているのかも知れませんが、フォームは無視してモジュールの■に数値を直接入れると正しく検索します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

こんなのはどうでしょうか?


モジュールコード
Private Sub CommandButton1_Click()
抽出 TextBox1.Text, TextBox2.Text
End Sub
フォームコード
Sub 抽出(条件1 As String, 条件2 As String)
Range("a4").AutoFilter field:=1, Criteria1:=">=" & 条件1, _
Operator:=xlAnd, Criteria2:="<" & 条件2
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございます。
急いでいたのでとても助かりました。

お礼日時:2009/05/17 09:35

質問者は、どんどん自分で考えている点は立派だが、事実と言うか勉強の方が着いていってないようだ。


http://stakayama.com/2009/04/13/%E8%87%AA%E5%88% …
コードを聞く前に、構想をしっかりしないと。
エクセルVBAとして
(1)FindやAutoFilterなどは、Range(シートのセル範囲)オブジェクトのメソッドです。このことをはっきり判っていますか。
わかって無いのに教えてくれというのは見当ハズレです。
(2)Userform1に、またその上に乗ったテキストボックスにFind、Filterメッソドが有るかどうか調べないといけない。多分無いと思う。ここで行っているのはTextBox1に長文の文章があり、その中から
語句を見つけるといった場合です。
ーー
多分、TextBox1などの値をシートのセルに一旦持ってきて、セル上で検索や抜き出しを、しないとならないでしょう。
そして質問には、ユーザーフォームにテキストボックスが多数有るのかどうかも書いてない。
多数(1つでもだが)有る場合、色々テキストボックスの値は変わるので、値を取るタイミング(トリガ)を決めないといけない。それは
イベントと言う考えを理解しないとならない。初心者にはわかりにくいだろう。
(コントロールによっては、LimkedCellといってセルとコントロールの値が連動するものも有るが、テキストボックスには無いようだ)
なぜ直接セルに入力しないのか。フォームなど使うのは格好よくしているだけでないのか。
ーー
初心者には背後知識が要りすぎて無理な課題だと思う。
ーー
案として
(1)フォームにコマンドボタンを1つ設ける
(2)そのコマンドボタンのクリックイベントの中で
TEXTBOX1からTextBoxxまでのTextbox1.Textなどの値をシートのセルに
順次代入する。多分同一列に、が望ましい。
そのやり方はわかるかな。(注)
(3)そこでシートのRangeを対象にFindやAutoFilterメソッドを使う。
(注)Cells(1,"A")=TextBox1.Text
Cells(2,"A")=TextBox2.Text
Cells(3,"A")=TextBox3.Text
・・・
と書くのは、テキストボックスの数が多いと面倒だよね。初心者はとりあえずこういう書き方をして、将来はWEBででも、かっこいい書き方を勉強のこと。
先日も質問がこのコーナーであった。キーワードはControlsだと思う。
>フォームのコードと標準モジュールのコードをどう繋げたらよいのかわかりません
(1)イベントで連動する
(2)コントロールの値を、シートのセルと言う土俵に持ってきて
そこでの勝負なる。土俵によっては、その使える道具(メソッドなど)がない場合もある。
これがObjectというもの。
    • good
    • 0
この回答へのお礼

懇切丁寧な解説ありがとうございました。
勉強の方はまだ何もできていないのですが、急ぎで、仕事上必要なためご無理言いました。
勉強時間があまり取れないため、どのような勉強の仕方が合理的に理解できるか教えていただければ幸いです。

お礼日時:2009/05/17 18:02

このQ&Aに関連する人気のQ&A

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

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

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

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

QAccess2007のフォームウイザードでデータシートを作りたいが方法が分からない

Access2003では、フォームウイザードでデータシートを作れたが。
Access2007では、フォームウイザードでは単票のフォームしか作れない様だ。

どうやって、作るのだろうか。操作が分からない。

Aベストアンサー

どういう帳票が欲しいかわかりませんが一応例として....
まずAccess上部にある作成をクリックします。
フォームウィザードをクリックして使用するテーブルとフィールドを選択します。
次に表形式を選択すれば帳票形式でフォームが作成されます。

もう1つはその他のフォームから複数のアイテムを選択すれば帳票形式でフォームが作成されます。

QSubとEnd Subについて

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate URL
objIE.Visible = True

Do Until objIE.Busy = False
WScript.sleep(250)
Loop

If objIE.document.URL = URL Then
BodyText = objIE.document.body.innerTEXT
AriNashi = InStr(1, BodyText, "Yahoo")
If AriNashi > 0 Then
Set objINPUT = objIE.document.getElementsByTagName("input")
objINPUT(0).value = LoginID
objINPUT(1).value = Password
objINPUT(2).Click
Else
msgbox "NO"
End If
Else
WScript.Echo " ダ メ" & Err.Description
End If
Set objIE = Nothing

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate ...続きを読む

Aベストアンサー

Subで囲むとプロシージャとなります。
プロシージャは他から呼び出されない限り、勝手に動作はしません。

Sub Hoge
'実体
End Sub

と書いたなら、プロシージャの外で
Call Hoge()
のようにプロシージャを呼び出してあげてください。

Q【Access】複数フォームを閉じる時の、選択処理について

Access Ver. : 2003
Windows Ver.: XP

Accessフォームの「閉じる時」処理で、下記のような工夫をした
いと考えております。

・フォームがひとつしか開かれていないとき、Accessを終了する
・複数のフォームが開かれている時、そのフォームのみを閉じる

そんなVBAコードがありましたら、教えてください。
何か参考になるページでも、かまいません。
どうぞ、宜しくお願いいたします。

Aベストアンサー

forms.count で開いているフォーム数を得て分岐
Application.quit

Access VBE のヘルプで、CurrentProject オブジェクト を見てみたら?

QVBのフォームモジュールと標準モジュールの使い分け

VBのフォームモジュールと標準モジュールの使い分けが今一つわかっていません。
フォームモジュールとは、フォーム(画面)上で起こったイベント(例えば、ボタンをクリックした時とか、ユーザーが行を選択したりだとか)の処理を、記述するところと解釈しています。
標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり、フォームが1つでも、同じ処理を繰り返す場合、その処理を標準モジュールに書いたり・・・・という解釈をしています。
あってますでしょうか?

フォームが一つしかない場合、もしくは2つあっても、あまり共通する処理がない場合、なんかは標準モジュールはあまり使わないのでしょうか?
それとも、フォームが1つとかでも、今後のメンテの事など考慮して、標準モジュールを作ってそこにグローバル変数なんかで処理を書いた方がよいのでしょうか?
どなたか、教えてくださいませんか?
いろいろBBSなどで見てみるんですが、いろいろ書いてあって、どれが理想か
わかりません。よろしくお願いいたします。

Aベストアンサー

>標準モジュールは、フォームが2つ以上あって、その2つが共通する処理(関数)などを、記述したり
で良いと思いますよ。
逆に
>フォームが1つでも、同じ処理を繰り返す場合
は、フォームモジュールの中に関数を作ってしまうので良いのでは?

参考になるかわかりませんが、私はDBとの接続や、起動時の全フォームのロード、定数やプロジェクトレベルでのグローバル変数の宣言等に使用しています。
そういえばMain関数は標準モジュールにしか書けませんでした…っけ?
メッセージボックスを表示する際の関数を自分で定数とMsgBox()を組み合わせて使い勝手の良い物にする…というのもよくやります。

QACCESSフォームのボタン表示

ACCESSフォームのボタン表示

ACCESS2000で作成したフォームのボタンはACCESS2007でも変わりません。
ACCESS2007で一から作成したMDBは、ボタンの表示スタイルが異なります。
※ボタンの角が丸く、マウスカーソルをボタンの上に当てるだけで色が変わる。
ACCESS2000で作成したMDBをACCESS2007で上記のように表示させる設定は
あるのでしょうか?
いろいろ見ても、見当たらないのです。
よろしくお願いします。

Aベストアンサー

[Office ボタン] - [Accessのオプション] - [カレントデータベース] で
「フォーム上のコントロールに Windows のテーマを使用する」にチェック。

QSub-EndでConsole.Writeでコマンドプロンプト出力したい

VB.NET2003:WindowApplication の Sub~End で 出力Console.Write("***") としてもコマンドプロンプトウィンドウにでないで、.NETウィンドウのデバッグ欄にしか出ない。前もって何かを指定しなければならないのでしょうが全くわかりません。ConsoleApplication ではうまくいっていますが。初心者なのでよろしくお願いします。

Aベストアンサー

Windows Applicationは,コンソールを持ちません。
# AllocConsole API等を使えば,専用コンソールを持てますが。

コンソールへ出力したいのであれば,Console Applicationにする必要があります。
なお,Console ApplicationであってもWindows Formsを開く事は可能です。

QExcelで作成されたフォームをAccessにコンバージョンしたいので

Excelで作成されたフォームをAccessにコンバージョンしたいのですが、フォームのインポートはできないのでしょうか?
Accessのフォーム作成画面から、インポートを選択していって、Excelファイルを開くのですが、シートしか選択できません。
コントロールのコピペもできないみたいですが。。。
Excelで作成されたフォームはAccessにはインポートできないのですか?
コーディングをそっくり使用することはできなくても、せめてフォームのデザインはコピーしたいのですが。。。(> <)
よろしくお願いします。m(_ _)m

Aベストアンサー

質問者はプロかプロ経験者ですか。でないならこんな勉強は試みないほうが良いでしょう。
市販の書物や初心者向けの講習で説明される話題ではない。プロで会社にその辺の経験者がいたりすれば聞けるでしょうが。原理的には最熟練者の人は変換プログラムは組めるかもしれませんが、そのレベルの人は、この質問コーナーを読んでないでしょうし、無料で教えるスキルではないと思います。
WEBの記事も多分少ないでしょう。
Googleででも「エクセル フォーム アクセス 移行」で出てくる記事を参考にしてはどうでしょう。
http://www.accessclub.jp/bbs2/0080/beginter24987.html
同じ発想の人はいることはいるが。
ーー
VBAとVBのフォームはコードで扱う上で微妙に違うし、アクセスVBAとエクセルVBAでは違う点も多い。
またコントロールの生成もコードで行う方法は隠して、易しいD&Dやマウスによる移動、プロパティボックスでの入力にして易しくしています。
エクセルのUserForm1のフォームも本格的なものではないサービスのような気がする。エクセルで第3者を巻き込んだ業務の開発までは予定して無いように推測する(何でもエクセル的な過大期待が横行している)。
それにエクセルでのセルとの連携をつけた機能LinkedCell、FillいstRangweなどはエクセル特有で、RecordSourceのSQL指定やフォーム指定はアクセス特有と思います。
外観を決めるサイズや書式関係は(エクセルでフォームやコントロールの)プロパティーメモー(アクセスでのフォームやコントロールの)プロパティ設定でやや似せて移せるかもしれない。
エクセルバージョン内の相違、エクセル・アクセルで使えるコントロールの種類の相違などもあります。

質問者はプロかプロ経験者ですか。でないならこんな勉強は試みないほうが良いでしょう。
市販の書物や初心者向けの講習で説明される話題ではない。プロで会社にその辺の経験者がいたりすれば聞けるでしょうが。原理的には最熟練者の人は変換プログラムは組めるかもしれませんが、そのレベルの人は、この質問コーナーを読んでないでしょうし、無料で教えるスキルではないと思います。
WEBの記事も多分少ないでしょう。
Googleででも「エクセル フォーム アクセス 移行」で出てくる記事を参考にしてはど...続きを読む

Qsubプロシージャーですか?subステートメン

----------------
Sub test()

End Sub
----------------
は、subプロシージャーですか?subステートメントですか?

上記のコードの「Sub」にカーソルをあて、F1を押すとヘルプが立ち上がり「Sub ステートメント」と表示されますが、

挿入(I)→プロシージャー(P)を見ると画像のように「Subプロシージャー」となっています。

どちらが正しいのでしょうか?
どちらも正しいのでしょうか?

Aベストアンサー

Sub~という構文が「Subステートメント」。プログラミング言語では、ステートメントは「文」とも訳されます。
そのSub~End Subで定義した一連のものが「Subプロシージャ」。プロシージャは「手続き」とか言う意味。

だから、Subのヘルプを見ると、Subステートメントの書式などになってるし、
挿入→プロシージャでは、「手続き」とての一かたまりを挿入するから、End Subまでになる。

QVBからmdbファイル(Access2000)の特定のフォームを開きたい?

VisualBasicのフォームに配置したコマンドボタンをクリックすることで、特定のmdbファイルをAccess2000で開き、開くと同時に特定のフォームが表示されるようにしたいのですが、こんなことできますか?できるとすればどのようにすればよいのですか?

例えば、C:\商品管理\在庫一覧.mdbにフォーム商品があるとしたとき、
Form1のcommand1をクリックすると、C:\商品管理\在庫一覧.mdbがAccess2000で開き、フォーム商品が最初に表示されるようにしたいのですが・・・
ちなみに、Access2000の起動時の設定では他のフォームが最初に開くようになっています。
よろしくお願いします。

Aベストアンサー

オートメーションを使ってAccessを制御しましょう。
で、他のフォームが最初に開くようになっていることなので、最初に開くフォームを閉じてからAccessを表示するようにすればいいと思います。

Dim acs as Object

'AccessのApplicationオブジェクトを取得する。
Set acs = CreateObject("Access.Application")

'c:\test.mdbを開くacs.OpenCurrentDatabase "c:\test.mdb"

'起動時に開かれたフォームを閉じる
'2はacForm定数のこと
acs.Close 2,"フォーム名"

'Accessを表示させる
acs.Visible = True

'表示させたいフォームを開く
acs.OpenForm "フォーム名"


こんな感じで。

最後に、Accessを終わらせるときは

'オブジェクトの開放
Set acs = Nothing

で、オブジェクトを開放してください。

オートメーションを使ってAccessを制御しましょう。
で、他のフォームが最初に開くようになっていることなので、最初に開くフォームを閉じてからAccessを表示するようにすればいいと思います。

Dim acs as Object

'AccessのApplicationオブジェクトを取得する。
Set acs = CreateObject("Access.Application")

'c:\test.mdbを開くacs.OpenCurrentDatabase "c:\test.mdb"

'起動時に開かれたフォームを閉じる
'2はacForm定数のこと
acs.Close 2,"フォーム名"

'Accessを表示させる
acs.Visibl...続きを読む

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。


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

人気Q&Aランキング