プロが教えるわが家の防犯対策術!

ユーザーフォーム上のコンボボックスから値を選択し、その値を変数として使いたいのですが、うまくいきません。

コンボボックスのコードで
Private Sub ComboBox1_Change()
moji1 = ComboBox1.Text
Range("A1").Value = moji1
のようにすれば、コンボボックスから値を選んだ時点でA1セルにその値をコピーできるのですが、同じユーザーフォーム上にあるコマンドボタンをクリックして実行する「マクロ1」にてこのmoji1という変数を使いたいのです。

マクロ1にて、上記と同じ
Range("A1").Value = moji1
というコードを記述しても、ユーザーフォームで選択した値が消えており、empty値となってしまいます。

原因をご存知の方はお教えください。

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

A 回答 (3件)

原因については下記を参考にしてください。


http://pc.nikkeibp.co.jp/pc21/special/2007_gosa/ …
    • good
    • 4

こんばんは。



プロシージャ内は、プロシージャレベル変数で、その範囲だけですが、変数を他のプロシージャで使用するなら、プロシージャの外に、モジュールレベル変数のMoji1 を置けば十分だとは思うけれども、以下のように、直接、ComboBox1の値をとればよいのでは?なお、モジュールレベル変数も、UserForm モジュールですから、ローカル変数です。


Private Sub CommandButton1_Click()
 If ComboBox1.Text <> "" Then
  Range("A1").Value = ComboBox1.Text
 End If
End Sub
    • good
    • 5

Private Sub ComboBox1_Change()


で、定義された変数(moji1)は、ローカル変数になるので、
Private Sub ComboBox1_Change()の中でしか有効ではありません
マクロ1で、Range("A1").Value = moji1 としても、このmoji1は
名前は同じでも、中身は別になります

moji1 をグローバル変数として定義すれば、ご希望の動作をさせることが出来ます
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …

ただ、ひとつの変数を使いまわすと、マクロが大きくなるに従いミスの原因となる可能性が大きくなりますよ

マクロ1で、改めて
moji1 = ComboBox1.Text
で、読み込むか
"A1"に書き込んだ後なら、"A1"から読み込んだ方が良いと思います
moji1 = Range("A1").Value
    • good
    • 2

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

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

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

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

QExcel コンボボックスの値参照

シート上に配置したコンボボックスの選択されている値を
マクロの中で参照するにはどうすればよいのでしょうか?

Aベストアンサー

>このままのコードを実行するとDropDowns()が定義されてないとエラーになってしまいます。
どんなエラーかよくわかりませんが、少し追記すると、

まず、『ドロップ 1』はコンボボックスの名前です。新規に作成すると名前ボックス(シートの左上)に表示されます。
コンボボックスに別名を付けている場合はそれに変更します。

次に、

 Sub Test1()
   With DropDowns("ドロップ 1")
     MsgBox .ListIndex
   End With
 End Sub

は、Sheet1にコンボボックスがあって、Sheet1のコードウインドウに書く例です。


Sheet1にコンボボックスがあって、標準モジュールに書く場合は、

 Sub TestMoj1()
   With Worksheets("Sheet1").DropDowns("ドロップ 1")
     MsgBox .ListIndex
     MsgBox .List(.ListIndex)
  End With
 End Sub

のようにします。多分メッセージボックスが出ると思いますが・・・(Excel97で確認)

>このままのコードを実行するとDropDowns()が定義されてないとエラーになってしまいます。
どんなエラーかよくわかりませんが、少し追記すると、

まず、『ドロップ 1』はコンボボックスの名前です。新規に作成すると名前ボックス(シートの左上)に表示されます。
コンボボックスに別名を付けている場合はそれに変更します。

次に、

 Sub Test1()
   With DropDowns("ドロップ 1")
     MsgBox .ListIndex
   End With
 End Sub

は、Sheet1にコンボボックスがあって、Sheet1のコ...続きを読む

QExcel VBA コンボボックスの初期値の設定について

いつもお世話になっています。
Excel VBA コンボボックスの初期値の設定について教えてください。
ユーザーフォームを表示させた時、そこにあるコンボボックスには何も表示されていません。
コンボボックスのボタンを押すとちゃんと
「アジア」「ヨーロッパ」「アメリカ」等の語群が表示されます。

ユーザーフォームを表示させた時点でコンボボックスに「アジア」を表示させるにはどうすればいいか教えてください。
よろしくお願いします。

Aベストアンサー

UserForm Initialize
ComboBox1.Text = ComboBox1.List(0)

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

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

Aベストアンサー

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

QVBAでシートからコンボボックスにデータを設定する方法

VBAにてフォーム起動時にシート内に設定した
値をコンボボックスに取り込みたいのですが・・。
たとえばA列に連続で入力されているデータを
取り込むなど・・。
設定データ数は動的に変化します。

Aベストアンサー

もうほとんど同じですが…

Private Sub UserForm_Initialize()
Dim i As Integer

 ComboBox1.Clear
 For i = 1 To Worksheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Row
  ComboBox1.AddItem Worksheets("sheet1").Cells(i, 1).Value
 Next
End Sub

Q【Excel VBA】コンボボックスで選択した値の取得

Excel2003を使用しています。

SheetAから、あるシート(都度選択)にデータを転記するマクロを作成しています。
当初は、下記のように InputBox で、転記先のシート名を入力して、そこからシート名を取得していましたが、確実にシート名を取得するために、ユーザーフォームのコンボボックスから選択するように、変更したいと思います。

 MySht = InputBox("転記するシート名を入力してください")
  With Sheets("SheetA")
   .Range("H6:J9").Copy
    Sheets(MySht).Range("M7") ~

これを、コンボボックスで選択した値を上記のコードでいう、MySht に設定(?)したいのですが、どのようにしたらいいでしょうか?
コンボボックスで選択した値をセルに転記する方法はわかるので、とりあえず、今は一旦セルに転記していますが、コード内で直接(…というと変かもしれませんが)設定できるのであれば、教えていただきたいのです。
自分だけが使用するものならば、InputBox で十分なのですが、選択するシートのシート名に数字が含まれているので、全角や半角の入力ミスを避けるために、コンボボックスで選択するようにしたらどうかと思ったのですが、何か他にも良い方法があれば、あわせて教えていただけると嬉しいです。

よろしくお願いします。

Excel2003を使用しています。

SheetAから、あるシート(都度選択)にデータを転記するマクロを作成しています。
当初は、下記のように InputBox で、転記先のシート名を入力して、そこからシート名を取得していましたが、確実にシート名を取得するために、ユーザーフォームのコンボボックスから選択するように、変更したいと思います。

 MySht = InputBox("転記するシート名を入力してください")
  With Sheets("SheetA")
   .Range("H6:J9").Copy
    Sheets(MySht).Range("M7") ~

これを...続きを読む

Aベストアンサー

なぜコンボボックスなのでしょう? リストボックスにシート名を表示させれば「誤入力」は起きないはずなのですが? 
でもコンボボックスを用いるなら「誤入力の可能性」がありますから、エラーチェックが必要になりますよ。

とりあえずUserformにComboboxを1つ配置して、ユーザーフォームのモジュールシートに以下のマクロを貼り付けて試してみてください。

Const excpt As String = "SheetA" 'コピー元のシート名
Private Sub UserForm_Initialize()
Dim sht As Worksheet
For Each sht In ThisWorkbook.Worksheets
  If sht.Name <> excpt Then
    Me.ComboBox1.AddItem sht.Name
  End If
Next sht
End Sub

Private Sub ComboBox1_Change()
  If Len(ComboBox1.Text) = 0 Then
    MsgBox "シートを選択するか入力してください"
    ComboBox1.SetFocus
  Else
    On Error GoTo err1
    Worksheets(excpt).Range("H6:J9").Copy _
      Destination:=Worksheets(ComboBox1.Text).Range("M1")
    Unload Me
    Exit Sub
  End If
err1:
  MsgBox "該当するシートがないので再入力してください"
  ComboBox1.SetFocus
End Sub

なぜコンボボックスなのでしょう? リストボックスにシート名を表示させれば「誤入力」は起きないはずなのですが? 
でもコンボボックスを用いるなら「誤入力の可能性」がありますから、エラーチェックが必要になりますよ。

とりあえずUserformにComboboxを1つ配置して、ユーザーフォームのモジュールシートに以下のマクロを貼り付けて試してみてください。

Const excpt As String = "SheetA" 'コピー元のシート名
Private Sub UserForm_Initialize()
Dim sht As Worksheet
For Each sht In ThisWor...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

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に入れた文字列が表示
されました。
がそんな質問ではないのですか。

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

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別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?


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

人気Q&Aランキング