ど素人ですので、よろしくお願いいたします。
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と関連する良く見られている質問

QExcel VBA 検索した値を入力フォームに表示

VBA初心者ながら、顧客管理用に入力フォームなどを作っています。

検索フォームを作成し、名前や住所などをキーワードに実行ボタンを押して検索すると、顧客シートからデータを引っ張ってきて、検索フォームの下に対象リストが表示されます。(今回の場合は顧客シートのNo1、12、17のデータを引っ張ってきています。)

そこから、イメージとしては、画像のように3件結果が出力された内、一番上の検索結果をクリックすると、入力フォームに選択した対象者の情報が表示されるようなことをしたいのですが、何から手をつけたらよいかがわかりません・・・。

ちなみに、検索フォームに表示される値は、実際の入力フォームに入力する項目より少ない(例えば、入力フォームでは「ふりがな」がありますが、検索フォームに検索結果としては「ふりがな」は表示されていません。)

かなり大雑把な質問ですが、アドバイスなど頂けると幸いです。

Aベストアンサー

リストで選択したデータが存在する行番号が rowNumber に正しく取得できていますか?
私のサンプルで想定している環境は以下のように想定しています。

・ データ群が書き込まれているシートの 1行目が項目名になっていて、2行目からデータが入力されている。
・ 1つのデータは 1行で完結する。
・ 1列目(A列)には抜けもれなく通し番号が振ってある。(1件目の A2 が 1 で、 2件目の A2 が2、以下 1ずつ増えていっている)
・ 検索フォームのリストボックスの 1列目は、データ群のシートの A列の値(通し番号)が表示されている。

という状況なので、
1. 検索結果のリストから 1つのクリックする。
2. クリックされたリスト項目の 1列目の値をもとに、元の場所の行番号を割り出す。(元のデータのシートは 2行目からデータが始まっているのでリスト項目 1列目の値に 1 を加算すれば元の行番号になる)


もし以下のような環境だと、選択したリスト項目の内容から元のデータの行番号を推察することができません。
・ データ群のシートの 1列目は ID となっていて、改廃されていくと番号が飛ぶこともある。
・ 検索フォームのリストの 1列目は ID の値である。

この場合はリストボックスの 1列目に隠し列を作って起き、元の行番号を表示させておくのはどうでしょうか。
1列目の列幅を 0 pt にすれば見えません。(ColumnWidth プロパティ)

リストで選択したデータが存在する行番号が rowNumber に正しく取得できていますか?
私のサンプルで想定している環境は以下のように想定しています。

・ データ群が書き込まれているシートの 1行目が項目名になっていて、2行目からデータが入力されている。
・ 1つのデータは 1行で完結する。
・ 1列目(A列)には抜けもれなく通し番号が振ってある。(1件目の A2 が 1 で、 2件目の A2 が2、以下 1ずつ増えていっている)
・ 検索フォームのリストボックスの 1列目は、データ群のシートの A列の値(通し番号)...続きを読む

Qエクセル・VBAでテキストボックスに入力された文字を

エクセル・VBAでテキストボックスに入力された文字を
B列から検索し、結果をユーザーフォームのリストbox
に表示したいのですがうまくいきません
検索は部分一致・大文字小文字無視で行いたいです
よろしくお願いします

Aベストアンサー

部分的に一致していても、リストに追加するように出来ますか?
If Range("B" & i).Value = TextBox1.Value Then

If Range("B" & i).Value Like "*" & TextBox1.Value & "*" Then
にするとか

また、表示された1・2列目をクリックすると、そのセル
をアクティブに出来ると良いのですが・・・
No1の方のコードをお借りします。
Private Sub ListBox1_Click()
Range("C:C").Find(what:=ListBox1.Value, LookIn:=xlValues, lookat:=xlPart, MatchCase:=False).Activate
End Sub
とかでは?

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

Qエクセル VBA ユーザーフォームを閉じる

ユーザーフォームを開く時は
UserForm1.Showですが
閉じる時は?
UserForm1.Close
だとコンパイルエラーになります。
End
にするしかないですか?

Aベストアンサー

Unload Me とか Unload UserForm1 でユーザーフォームを閉じることができます。

QエクセルVBA 複数の条件を含む対象を抜き出す。

エクセルVBAについて質問です。
エクセルのバージョンは2003と2007を主に使用しています。

下記の様なデータがあるときに、部活が「野球」でかつクラブは「囲碁」に入っている生徒の学籍番号を別のシート(Sheet2)のB3から下に順にリスト化するマクロがどうしても出来なくて困っています。
find next等を使うのでは無いかと色々してみましたが上手く出来ない現状です。

<sheet1>
   A      B      C       D    E

1 学籍番号 学年    名前     部活   クラブ
2 2222222   1   山田 太郎  野球   囲碁
3 9854923   2   吉田 次郎   剣道   絵画  
4 1111111   3   佐藤 三郎  野球   囲碁
5 8888883   1   米山 権蔵  卓球   囲碁

Aベストアンサー

こんばんは!
Sheet1のA列(学籍番号)のみをSheet2のB3セル以降に表示すれば良いわけですね?
一例です。

画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に
↓のコードをコピー&ペーストしてマクロを実行してみてください。

Sub test()
Dim i, k As Long
Dim ws As Worksheet
Set ws = Worksheets(2)
k = 2
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(i, 4) = "野球" And Cells(i, 5) = "囲碁" Then
k = k + 1
ws.Cells(k, 2) = Cells(i, 1)
End If
Next i
End Sub

こんな感じではどうでしょうか?m(_ _)m

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む

QExcel VBAで、ユーザーフォームの値を、モジュールで使用したい。

VBA初心者です。(おそらく)基本的な質問で、申し訳ありません。
ユーザーフォーム1には、テキストボックス1とコマンドボタン1が配置されているとします。

Sub TEST ()
Dim N
Userform1.Show
MsgBox N
End Sub

Private Sub CommandButton1_Click()
Dim N
N = TextBox1.Text
UserForm1.Hide
End Sub

Sub TESTを実行した時に、ユーザーフォーム1からNの値を引き継ぐには、どうしたら良いのでしょうか?よろしくお願いします。

Aベストアンサー

'モジュールに変数宣言(グローバル変数)
'Public 宣言すると他のモジュールやフォームと
'共有できる変数になります。
Public AA As String

'sample
'A1 を実行する。

Sub A1()
Call A2
AA = InputBox("input", , AA)
End Sub

Sub A2()
AA = InputBox("input", , AA)
End Sub

QExcel VBA でテキストボックスの値をセルA列から検索

いつもお世話になります。
Private Sub CommandButton3_Click()
Dim 行 As String
Dim 列 As String
Dim 最終行 As String
Dim 検索行 As String
Dim メッセージ As Integer
Dim 一致 As Range
Dim myNO As Variant
Dim i As Long
Sheets(3).Select
最終行 = Range("A2").End(xlDown).Offset(1).Select
行 = ActiveCell.Row
列 = ActiveCell.Column
myNO = TextBox2.Value
検索行 = Range("A2").End(xlDown).Select
※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole)
If 一致 Is Nothing Then
MsgBox "データがありません。新規コード入力します。"
Cells(行, 列 + 0) = UserForm1.TextBox2.Value
Cells(行, 列 + 1) = UserForm1.ComboBox7.Value
Else
i = Cells(行 - 1, "A")
Cells(i, 列 + 0) = UserForm1.TextBox2.Value
Cells(i, 列 + 1) = UserForm1.ComboBox7.Value
End If
End Sub

「エラー1004'Range'メソッドは失敗しました'Global'オブジェクト」とでます。※印が黄色になっています。
ユーザーフォーム1のテキストボックスの値をシート3のA列から検索して、一致すれば、A列の一致セルに上書き入力して、一致が無い場合はA列の空白セルに追加入力したいのです。よろしくお願い致します。

いつもお世話になります。
Private Sub CommandButton3_Click()
Dim 行 As String
Dim 列 As String
Dim 最終行 As String
Dim 検索行 As String
Dim メッセージ As Integer
Dim 一致 As Range
Dim myNO As Variant
Dim i As Long
Sheets(3).Select
最終行 = Range("A2").End(xlDown).Offset(1).Select
行 = ActiveCell.Row
列 = ActiveCell.Column
myNO = TextBox2.Value
検索行 = Range("A2").End(xlDown).Select
※・・・Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole)
...続きを読む

Aベストアンサー

えっと、いろいろ改善の余地があるマクロなので、気がついたところを指摘していきます。

Dim メッセージ As Integer

この変数は使われてないので宣言は不要かと思います。(もし質問文のVBAが抜粋で、後で使うのなら別ですが)

最終行 = Range("A2").End(xlDown).Offset(1).Select

この「最終行」に範囲をSelectした結果を代入しているのは、意味がありません。最終行には True が代入されます。最終行のセル番地を代入したいのであれば、

最終行 = Range("A2").End(xlDown).Offset(1).Addresss

とする必要がありますが、その次の2行で行と列を取得しており、そして変数「最終行」はプロシージャの最後まで使われていません。

myNO = TextBox2.Value

この変数も最後まで使われていません。Findの引数として使おうとしたのかと思いますが、Findではもう一度TextBox2と書いてしまっています。

検索行 = Range("A2").End(xlDown).Select

これも先の最終行と同じく、Selectした結果を代入しているため、Trueが代入されてしまいます。今までの指摘は、マクロの動作に影響を与えるものではありませんでしたが、ここは違います。この後で検索範囲の一番下のセルとして使おうとしても、これではその番地が代入されないのです。

その次の、

Set 一致 = Range("A2:検索検").Findwhat:=TextBox2,lookat:=xlWhole)

は書式が崩れてますがですが、多分書きたいことは

Set 一致 = Range("A2:検索行").Find(what:=TextBox2,lookat:=xlWhole)

ですよね。しかし"A2:検索行"という範囲指定はできません。「検索行」は変数なので文字列に含めてしまってはいけません。「検索行」にセル番地が入っているのであれば、Range("A2:" & 検索行) あるいは Range("A2",検索行") のようにしないと正しく領域を指定できません。

以上を踏まえて、Range型の変数を使うようにして書き直してみました。

Private Sub CommandButton3_Click()
 Dim 最終行 As Range 'Stringから変更
 Dim 検索行 As Range 'Stringから変更
 Dim 一致 As Range
 Sheets(3).Select
 Set 検索行 = Range("A2").End(xlDown)
 Set 最終行 = 検索行.Offset(1)
 Set 一致 = Range("A2", 検索行).Find(what:=TextBox2, lookat:=xlWhole)
 If 一致 Is Nothing Then
  MsgBox "データがありません。新規コード入力します。"
  最終行.Value = UserForm1.TextBox2.Value
  最終行.Offset(0, 1).Value = UserForm1.ComboBox7.Value
 Else
  一致.Value = UserForm1.TextBox2.Value '同じ値なので本来は不要
  一致.Offset(0, 1).Value = UserForm1.ComboBox7.Value
 End If
End Sub

えっと、いろいろ改善の余地があるマクロなので、気がついたところを指摘していきます。

Dim メッセージ As Integer

この変数は使われてないので宣言は不要かと思います。(もし質問文のVBAが抜粋で、後で使うのなら別ですが)

最終行 = Range("A2").End(xlDown).Offset(1).Select

この「最終行」に範囲をSelectした結果を代入しているのは、意味がありません。最終行には True が代入されます。最終行のセル番地を代入したいのであれば、

最終行 = Range("A2").End(xlDown).Offset(1).Addresss

...続きを読む

QエクセルVBAでテキストボックスの値の取得と変更について

エクセルのVBAを使ってシート上のテキストボックスのテキストを取得・変更するマクロを作成したいと思っていますがうまく行きませんので、お知恵を拝借したいとおもいます。

環境:WindowsXPでオフィス2002
状況:
エクセルブックa.xlsのシートに「コントロールツールボックス」のテキストボックスを配置(オブジェクト名はTEXTBOX_C)
エクセルブックb.xlsにコードを書き、a.xlsのTEXTBOX_CのプロパティのValueかTextを取りだしたい

試した事:
コントロールを配置したシートに次のマクロ
TEXTBOX_C.Text = "これはコントロールのテキストボックス"
を書くとテキストボックスに文字を入れ込めますが、別のエクセルブックからだと上手く行きません。

また、オートシェイプのテキストボックスの場合は簡単に出きるのですが、コントロールツールボックスではどうしても上手く行きませんので、対象法などご存知の方いらっしゃいましたら教えてください

Aベストアンサー

エクセルを新規に開きました。
そのSheet1に(コントロールツールボックスの)TextBoxを貼りつけました。
そのBook1から、ファイル-開くで別ブックを開きました。
別ブックのMojule1側に下記を書いて
Sub test02()
MsgBox Workbooks("book1").Worksheets("sheet1").textbox1.Text
End Sub
を実行すると、Book1のTextBoxに入れた文字列が表示
されました。
がそんな質問ではないのですか。

Qユーザフォームを使ってのデータの書き換え(エクセル)

sheet1に下記のように商品のデータ一覧が入っており、
価格の改定があった時に[単価]に新しい価格をいれ、
当初[単価]に入っていた価格を[旧単価]に入れるようを作っています。

コード 商品名  単価  旧単価  改定日
1111  商品A  1000
1112  商品B  1500
1113  商品C  1200



コード 商品名  単価  旧単価  改定日
1111  商品A  1100  1000   2008/5/2
1112  商品B  1500
1113  商品C  1200

<UserForm>
コード [コードのTextBox]
商品名[商品名のLabel]
単価  [単価ののLabel]
新単価[新単価のTextBox]
改定日[改定日のTextBox]


ユーザーフォムでテキストボックスにコードを入れたら、
コードを商品のデータ一覧から検索して商品名と単価を
ユーザーフォムのLabel Captionに自動で表示されるようにしたいのです。

1.コードの入力
2.商品名、単価が表示される
3.新単価、改定日の入力
4.元のデータ(Sheet1)の書き換え

上記のような順序で考えていたのですが、
どうしてもコード入力からの検索表示が上手くいかないのです。
どうすれば良いのでしょうか?

※ユーザーフォームで[商品名][単価]をLabelにしてるのは、
数値・文字列として書き換えの必要がないので動かせないほうがいいのでは
とういう個人的な思い込みからですので、特にこだわりはございません。

相当な初心者のため、少しばかり注釈をつけてくださる大変ありがたいです。
上記のよう順番でなくても、よい方法があれば教えて下さい。
よろしくお願い致します。

sheet1に下記のように商品のデータ一覧が入っており、
価格の改定があった時に[単価]に新しい価格をいれ、
当初[単価]に入っていた価格を[旧単価]に入れるようを作っています。

コード 商品名  単価  旧単価  改定日
1111  商品A  1000
1112  商品B  1500
1113  商品C  1200



コード 商品名  単価  旧単価  改定日
1111  商品A  1100  1000   2008/5/2
1112  商品B  1500
1113  商品C  1200

<UserForm>
コード [コードのTextBox]
商品名[商品名...続きを読む

Aベストアンサー

コードのテキストボックスのChangeイベントで検索すればいいのでは

たとえば
コードテキストボックス : CodeText
新単価テキストボックス : NewPriceText
改定日テキストボックス : UpdateDateText
商品名ラベル      : NameLabel
単価ラベル       : PriceLabel
データの記述してあるシート: 商品マスター
といった名前だとします

Sub CodeText_Change()
  ' 検索二一致したセルを記憶する変数
  dim r as Range
  Set r = Worksheets("商品マスター").Range("A:A"). _
    Find( CodeText.Text, MatchCase = False )
  if r is nothing then
    ' 検索したが コードが見つからなかった場合
    Name.Label.Caption = "---"
    PriceLabel.Caption = "---"
    NewPriceText.Text = ""
    UpdateText.Text = ""
  else
    ' 該当コードがある場合
    ' 見つかったセルの隣のセルの内容をコントロール設定
    ' この場合に Rangeオブジェクトの Offsetメソッドで指示
    Name.Label.Caption = r.Offset(0,1).Value
    PriceLabel.Caption = r.Offset(0,2).Value
    NewPriceText.Text = r.Offset(0,2).Value
    UpdateText.Text = r.Offset(0,4).Value
  end if
End Sub

といった具合で検索出来るともいます

改訂 などのボタンを準備しておいて
Sub Kaitei_Click()
dim r as Range
  Set r = Worksheets("商品マスター").Range("A:A"). _
    Find( CodeText.Text, MatchCase = False )
  if r is Nothing then
    MsgBox "コードが見つかりません"
    Exit Sub
  end if
  ' 単価を更新
  r.Offset(0,2).value = NewPriceText.Text
  ' 旧単価列を更新
  r.Offset(0,3).Value = PriceLabel.Caption
  ' 改訂日を更新
  r.Offset(0,4).Value = DateValue( UpdateText.Text )
End Sub

# エラー処理を何もしていないので 適宜書き加えてください
# 日付がありえない日付であるとか、単価が金額として意味を成さない文字列であるとか
# 必要な箇所のデータが入力されていないなど

コードのテキストボックスのChangeイベントで検索すればいいのでは

たとえば
コードテキストボックス : CodeText
新単価テキストボックス : NewPriceText
改定日テキストボックス : UpdateDateText
商品名ラベル      : NameLabel
単価ラベル       : PriceLabel
データの記述してあるシート: 商品マスター
といった名前だとします

Sub CodeText_Change()
  ' 検索二一致したセルを記憶する変数
  dim r as Range
  Set r = Worksheets("商品マスター").Range("A:A"). _
   ...続きを読む


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

人気Q&Aランキング

おすすめ情報