ついに夏本番!さぁ、家族でキャンプに行くぞ! >>

書籍やインターネットををみながらユーザーフォームを作成し、前後への移動、
データ修正、新規作成、削除を行うことは無事にできるようになりました。

しかし、このままでは閲覧、修正がメインとなってしまい、
検索ができない為何とかできないものかと考えています。

A列 B列 C列    D列  E列
1  A  タイトル1 本文1 更新日
2  B  タイトル2 本部2 更新日
3  A  タイトル3 本部3 更新日

上記のようにシートに追記されていきます。
H2がデータ最終行となります。H1がユーザーフォームに表示されてる行です。

ユーザーフォームの情報は以下の通りです。
TextBox4・・・A列
ComboBox1・・・B列
TextBox1・・・C列
TextBox2・・・D列
TextBox3・・・E列

CommandButton1・・・前に移動
CommnadButton2・・・後ろに移動
CommandButton3・・・データ修正
ToggleButton1・・・新規作成
CommandButton5・・・削除
ToggleButton2・・・検索(を予定)


ユーザーフォームを起動するとSheetは非常時となります。
その中で各項目の入力や修正を行っております。
「検索」ボタンを取り付けてありますが、機能はしていません。


現在、希望している動作としまして、以下の通りです。

1.可能であればもう1つの検索ユーザーフォームを表示
 検索欄は1つ、ボタンも1つ。

2.入力した検索キーワードが含まれているデータを
 C列、D列から検索する。

3.最初のユーザーフォームに戻り、検索結果を確認が可能。

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

A 回答 (2件)

ユーザーフォーム上に、検索結果を表示するためのListBOXを配置した例です。


AddItemでリストに追加できます。
Private Sub CommandButton1_Click()
ListBox1.Clear'リストの内容をクリア
For i = 1 To 100
If Cells(i, 1) = 1 Then'A列が 1の場合
ListBox1.AddItem Cells(i, 2).Value'リストボックスにB列の値を追加
End If
Next
End Sub
    • good
    • 2

userform1のcommandbutton1 をクリックすると


userform1のtextbox1に書いたものを検索する例です。
 ここではなく標準モジュールに書いておいて
commandbuttonから呼び出すように変更することもできます。
検索でヒットするものが複数ある場合は
After:=Range("C2")ではなくAfter:=Activecell
などにしておかないと最初のものしか検索しません。

Private Sub CommandButton1_Click()
Sheets("sheet1").Range("C2:D8").Find(What:=UserForm1.TextBox1.Text, After:=Range("C2"), LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, MatchByte:=False, SearchFormat:=False).Activate
End Sub

この回答への補足

2つめのURLを削除されてしまいました。
今現在のコードは以下の通りです。
-----
Private Sub CommandButton1_Click()

If Cells(1, 8).Value > 2 Then
Cells(1, 8).Value = Cells(1, 8).Value - 1
End If

データ表示

End Sub
Private Sub CommandButton2_Click()

If Cells(1, 8).Value < Cells(2, 8).Value Then
Cells(1, 8).Value = Cells(1, 8).Value + 1
End If

データ表示

End Sub
Sub データ表示()

表示行 = Cells(1, 8).Value

ComboBox1.Value = Cells(表示行, 2).Value

TextBox4.Value = Cells(表示行, 1).Value
TextBox1.Value = Cells(表示行, 3).Value
TextBox2.Value = Cells(表示行, 4).Value
TextBox3.Value = Cells(表示行, 5).Value

End Sub

Private Sub CommandButton3_Click()

入力結果 = MsgBox("データを登録しますか?", vbYesNo)

If 入力結果 = 6 Then

If ToggleButton1.Value = True Then
表示行 = Cells(2, 8).Value + 1
Else
表示行 = Cells(1, 8).Value
End If

Cells(表示行, 2).Value = ComboBox1.Value

Cells(表示行, 1).Value = TextBox4.Value
Cells(表示行, 3).Value = TextBox1.Value
Cells(表示行, 4).Value = TextBox2.Value
Cells(表示行, 5).Value = TextBox3.Value

If ToggleButton1.Value = True Then
データクリア
TextBox4.Value = Cells(表示行, 1).Value + 1
Else
データ表示
End If

End If

End Sub

Private Sub CommandButton5_Click()

入力結果 = MsgBox("表示されているデータを削除しますか?", vbYesNo)

If 入力結果 = 6 Then

表示行 = Cells(1, 8).Value
Range(Cells(表示行, 1), Cells(表示行, 5)).Select
Selection.Delete shift:=xlUp

If Cells(2, 8).Value = 1 Then
ToggleButton1.Value = True
Else
If 表示行 > 2 Then
Cells(1, 8).Value = 表示行 - 1
End If
データ表示
End If
End If

End Sub

Private Sub CommandButton6_Click()
Unload Me
Application.Visible = True
End Sub

Private Sub ToggleButton1_Change()

If ToggleButton1.Value = True Then

データクリア
CommandButton1.Enabled = False
CommandButton2.Enabled = False
CommandButton5.Enabled = False
CommandButton3.Caption = "データ登録"

最終行 = Cells(2, 8).Value
If 最終行 = 1 Then
TextBox4.Value = 1
Else
TextBox4.Value = Cells(最終行, 1).Value + 1
End If

Else

CommandButton1.Enabled = True
CommandButton2.Enabled = True
CommandButton5.Enabled = True
CommandButton3.Caption = "データ修正"

Cells(1, 8).Value = Cells(2, 8).Value
データ表示

End If

End Sub

Sub データクリア()

ComboBox1.Value = "CSR"

TextBox1.Value = ""
TextBox2.Value = ""
TextBox3.Value = ""
TextBox4.Value = ""

End Sub


Private Sub CommandButton7_Click()
Sheets("QA").Range("C2:D8").Find(What:=UserForm1.TextBox2.Text, After:=Range("C3"), LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, MatchByte:=False, SearchFormat:=False).Activate
End Sub

Private Sub UserForm_Initialize()
Application.Visible = False
データ表示
End Sub
Private Sub UserForm_Terminate()
Application.Visible = True
End Sub

補足日時:2009/05/18 00:15
    • good
    • 1
この回答へのお礼

お忙しい中、ご返信をいただきましてありがとうございます。
早速、Sheets名、TextBox1を2にC2をC3に変更させていただき
設定してみたのですが、エラーとなってしまいました。

実行時エラー '91'
オブジェクト変数または With ブロック変数が設定されていません。

書籍やインターネットをみながら作ってみたコードが悪いために
このようなエラーが表示されてしまっているのでしょうか。

最初の質問の際、文字数が多いとのことで詳細まで書ききれず、
レスもつけられなかったため新規に作成したページにコードを
記載しています。

http://okwave.jp/qa4965208.html

お礼日時:2009/05/17 11:06

この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列の値(通し番号)...続きを読む

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ユーザフォームを使ってのデータの書き換え(エクセル)

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検索結果の指定列をリストボックスに反映したい

ユーザーフォームにTextbox、検索ボタン、Listboxを配置しました。
Textboxに「E列」の大分類(例:「35」)を入力して、検索ボタンを押すと、「35」のレコードのA列とB列だけListboxに反映させるようにしたいです。
皆さん、教えて下さい!宜しくお願いします。

 A列     B列    C列      D列    E列
商品コード/商品名/仕入先コード/仕入先名/大分類
123456 りんご 011 AAA 35
456789 ばなな 012 BBB 35
234567    テーブル  013 CCC 23

Aベストアンサー

元データはSheet1にあるとして

private sub CommandButton1_Click()
 dim r as long
 if me.textbox1 = "" then exit sub
 me.listbox1.clear
 me.listbox1.columncount = 2

 with worksheets("Sheet1")
 for r = 2 To .range("E65536").end(xlUp).row
  if cstr(.cells(r, "E").value) = me.textbox1.value then
   me.listbox1.additem .cells(r, "A").value
   me.listbox1.list(me.listbox1.listcount - 1, 1) = .cells(r, "B").value
  end if
 next r
 end with
end sub

ぐらいで,逐一追加していくのが一番簡単かと思います。

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
とかでは?

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

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

Aベストアンサー

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

Qエクセル VBA ユーザーフォームで検索したいのですが

つい昨日触り始めた大初心者です。。
エクセルシートにて
数値を記した列と、詳細を記した列があります。
ユーザーフォームにて
textboxに数値を入力し、ボタンをクリックすると
検索をして、ユーザーフォーム内のlabelに詳細が表示される、といったvbaを書いているのですが、どうにもうまくいきません。

また、textboxに検索範囲にない数値が入力されたときには
Labelに「なし」と表示させたいのですが、
エラーが出てしまい、その処理もやはりうまく出来ません。

どなたかご教授いただけますでしょうか。

Aベストアンサー

力業的なところがありますが、参考にしてください。
Labelに表示される詳細が判らなかったので、セルの値を表示するようにしました。

検索する範囲は、A列1行目から空白行までです。
検索値には、ワイルドカードが使用できます。
値が一致したところで終了。そのセルの値をLabel1に表示します。


--------------------------------------------------
Private Sub CommandButton1_Click()
Dim r As Long, Txt As String
 Label1.Caption = "なし"
 Txt = TextBox1.Text
 if Txt ="" Then Exit Sub
 r = 1
 With Worksheets("Sheet1")
  Do Until .Cells(r, 1).Value = ""
   If .Cells(r, 1).Value Like Txt Then
    Label1.Caption = .Cells(r, 1).Value
    Exit Do
   End If
   r = r + 1
  Loop
 End With
End Sub

力業的なところがありますが、参考にしてください。
Labelに表示される詳細が判らなかったので、セルの値を表示するようにしました。

検索する範囲は、A列1行目から空白行までです。
検索値には、ワイルドカードが使用できます。
値が一致したところで終了。そのセルの値をLabel1に表示します。


--------------------------------------------------
Private Sub CommandButton1_Click()
Dim r As Long, Txt As String
 Label1.Caption = "なし"
 Txt = TextBox1.Text
 if Txt ="" Then Exit S...続きを読む

QVBA フォームに入力された数値を検索条件としたい

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

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

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

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

Aベストアンサー

こんなのはどうでしょうか?
モジュールコード
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

Qユーザーフォームの入力をシートに反映

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついたのが、「ひとつ下のセルに記述する」ということでした。
で、本を見ながら考えたのが、
With Sheets(2)
Range("A1").Select
ActiveCell.Offset(1, 0).Value = TextBox1.Text
ActiveCell.Offset(1, 0).Value = TextBox2.Text
ActiveCell.Offset(1, 0).Value = TextBox3.Text
まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

(2)フォームOKボタンを押して、上記の処理をしても、フォームに記入したものが次にフォームを開いた時に消えていないように、
Me.Hide
End Sub
で終わらせたのですが、次に開いても残っていません。

無知でお恥ずかしいですが、宜しく御願い致します。

かなりの初心者(始めて3日)ですが宜しくお願いします。
しかも2点あります。。。

(1)ユーザーフォームにある大量のテキストboxないし、optionboxをエクセルのsheet2に反映させたいです。
で、地道に
With Sheets(2)
.Range("A22").Value = OptionButton184.Value
.Range("A23").Value = OptionButton185.Value
.Range("A24").Value = OptionButton186.Value
.Range("A25").Value = OptionButton187.Value
とAの行を手で直していたのですが、途中で間違えて、手直しは断念しました。そこで、思いついた...続きを読む

Aベストアンサー

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(2).Range("A1")
    .Offset(1, 0).Value = TextBox1.Text
これでSheet2のA2から書き出すはずです。(未確認です)

>で終わらせたのですが、次に開いても残っていません。
『残っていない』のではなく、最初にデザインした状態が再度表示されているわけです。

残すためには、プロパティ『ControlSource』にセルを指定する必要があります。
または、下の例示のように『Initializeイベント』で値を取得する必要があるでしょう。



質問では、オプションボタンやテキストボックスが沢山あるみたいですが、一括で処理する例です。

オプションボタン1~80の値をA1~A80に、
テキストボックス1~80の値をB1~B80に 書き込んでいます。

説明を簡略化するために、オプションボタン等の番号と書き出すセルの行番号を一致させています。

終了後、最後フォームを開いた時に書き込んだ値を取得するために、『Unload』で終わり、
『UserForm_Initialize』で取り込んでいます。コード表現は書き込みと逆ですね。


'Sheet2へ書き込む
Private Sub CommandButton1_Click()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を書き出し
    For i = 1 To 80
      .Range("A" & i) = UserForm1.Controls("OptionButton" & i).Value
    Next
    'テキストボックスの値を書き出し
    For i = 1 To 80
      .Range("B" & i) = UserForm1.Controls("TextBox" & i).Text
    Next
  End With
End Sub


'Formを呼び出したとき、Sheet2から読み込む
Private Sub UserForm_Initialize()
  Dim i As Integer

  With Worksheets(2)
    'オプションボタンの値を読み込み
    For i = 1 To 80
      UserForm1.Controls("OptionButton" & i).Value = .Range("A" & i)
    Next
    'テキストボックスの値を読み込み
    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

>まずA1を指定させて、下にずらしていけるかと思ったのですが、全然上手くいきません。しかもsheet1のA1を選択してるようです。どうしてでしょうか???

  With Sheets(2)
    Range("A1").Select
    ActiveCell.Offset(1, 0).Value = TextBox1.Text

多分、Sheet1からこのユーザーフォームが開かれているのでは?
『Range("A1").Select』があり『ActiveCell』を基準にしているので、『With Sheets(2)』が意味をなしていません。
書くなら、
  Sheets(2).Activate
  With Sheets(...続きを読む

Qユーザーフォームを表示中にシートの操作をさせるには

ユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。
セルへの入力、画面のスクロールなどは、ユーザーフォームからマクロを実行させたり、.hideでユーザーフォームを一時的に隠すなどすればいいのでしょうが、そういう手段をとらないでユーザーフォームを表示中にシートの操作をさせる事はできるのでしょうか。

Aベストアンサー

ユーザフォームの
ShowModalプロパティを
falseにすればよいかと。


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

人気Q&Aランキング