Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


3 / 13196 ツリー ←次へ | 前へ→

【80251】Targetにユーザーフォームの値を取得する babolat 18/12/3(月) 19:28 質問[未読]
【80253】Re:Targetにユーザーフォームの値を取得する 亀マスター 18/12/3(月) 19:45 回答[未読]
【80255】Re:Targetにユーザーフォームの値を取得する babolat 18/12/3(月) 20:03 質問[未読]
【80257】Re:Targetにユーザーフォームの値を取得する 亀マスター 18/12/4(火) 0:02 回答[未読]
【80259】Re:Targetにユーザーフォームの値を取得する babolat 18/12/5(水) 11:49 質問[未読]
【80260】Re:Targetにユーザーフォームの値を取得する 亀マスター 18/12/5(水) 23:44 回答[未読]

【80251】Targetにユーザーフォームの値を取得する
質問  babolat  - 18/12/3(月) 19:28 -

引用なし
パスワード
   皆様方、どうかご教授をお願いいたします。
初心者のため、質問に過不足がありましたらお許しください。

1.あるシートでセルをダブルクリックをするとユーザーフォーム(ファイル選択ダイアログボックス)が立ち上がります。
セルの位置がTargetに入ります。
2.ユーザーフォーム内で他のファイルを選択し、選択したファイルにある値を変数に取得します。
3.ダブルクリックをしたセルA1=Tagetにその変数を入れたいと考えています。

2.まではできたのですが、3.のやり方がどうしてもわかりません。

どのように書けばよろしいのでしょうか?
何卒よろしくお願いいたします。

【80253】Re:Targetにユーザーフォームの値を取得...
回答  亀マスター  - 18/12/3(月) 19:45 -

引用なし
パスワード
   TargetはダブルクリックしたセルをRange型の変数として取得しているので、

  Target.Value = 入力したい値(2.で取得した変数)

とすればいけると思いますよ。

なお、ダブルクリック時のイベントで

  Cancel = True

としておかないと、必要な値は入力できたもののそこが入力待機状態になるので、それが嫌ならどうぞ。

【80255】Re:Targetにユーザーフォームの値を取得...
質問  babolat  - 18/12/3(月) 20:03 -

引用なし
パスワード
   亀マスター様

早々にご回答いただきありがとうございます。
Target.Value=変数を書くのは、
ユーザーフォームとシートのどちらに、どのタイミングでしょうか?

尚、今考えている流れは以下の通りです。


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'あるシートでダブルクリックをするとUserFormが立ち上がる
UserForm.Show  
End Sub

Private Sub cbm_sansyou_Click()
'sansyouボタンを押すとファイルを選択するダイアログが表示される
'選択したファイルをmyFileに取得する
Dim myFile As Variant,buf as long
myFile = Application.GetOpenFilename
If VarType(myFile) = vbBoolean Then
MsgBox "キャンセルされました"
else
MsgBox myFile & " が選択されました"
End If
'myFileで選択したファイルのセルD17の値をbufに入れる
Workbooks.Open Filename:=myFile
buf = ActiveSheet.Range("D17")
ActiveWorkbook.Close
End Sub

Private Sub cmb_syukeikaisi_Click()
'UserFormのsyukeikaisiボタンを押すとダブルクリックしたシートのTargetにbufが入る
'ここに何を書くべきかよくわかりません
End Sub


お手数をおかけしてしまい申し訳ありません。
どうぞよろしくお願いいたします。

【80257】Re:Targetにユーザーフォームの値を取得...
回答  亀マスター  - 18/12/4(火) 0:02 -

引用なし
パスワード
   >Target.Value=変数を書くのは、
>ユーザーフォームとシートのどちらに、どのタイミングでしょうか?

やり方はいくつかあると思いますが、とりあえず2つほど

1.フォームのcmb_syukeikaisi_Clickで実行
1-1
bufはcbm_sansyou_Clickの中ではなくUserFormの直下で宣言するか、標準モジュールにパブリック宣言する。
1-2
標準モジュールにRange型の変数をパブリック宣言で用意しておく(例:Rng)
1-3
UserForm.Showの前に、RngにTargetの参照を格納。
(直接Targetを使わないのは、TargetはBeforeDoubleClickの中でしか動かないから)
  Set Rng = Target
1-4
bufに必要な値が入ったら、Rngを介してTargetに値を代入。
  Rng.Value = buf

2.WorkSheetのBeforeDoubleClickで実行
2-1
bufは標準モジュールにパブリック宣言する。
2-2
bufに必要な値が入ったら、フォームを閉じる。
  Unload Me
2-3
WorkSheetのUserForm.Showの続きでTargetにbufの値を代入。
  UserForm.Show
  Target.Value = buf


なお、質問に対する回答ではないのですが、ActiveWorkbookやActiveSheetは何らなの都合で狙ったブックやシートがアクティブになっていなかったときに不具合が起こるので、ブックを開いたときにWorkbook型やWorksheet型の変数に参照を格納し、それを使って操作した方が確実かと思います。

【80259】Re:Targetにユーザーフォームの値を取得...
質問  babolat  - 18/12/5(水) 11:49 -

引用なし
パスワード
   亀マスター様

ご回答いただきありがとうございました。
御礼が遅くなり失礼いたしました。

後で試してみます。

ちなみに、標準モジュールはこの箇所に関しては使用しておらず、
BeforeDoubleClickはシートのモジュールで、あとはユーザーフォームモジュールです。
この場合、標準モジュールに書くとご指示いただいたところは、シートモジュールに記載すればよろしいでしょうか?

【80260】Re:Targetにユーザーフォームの値を取得...
回答  亀マスター  - 18/12/5(水) 23:44 -

引用なし
パスワード
   >ちなみに、標準モジュールはこの箇所に関しては使用しておらず、
>BeforeDoubleClickはシートのモジュールで、あとはユーザーフォームモジュールです。
>この場合、標準モジュールに書くとご指示いただいたところは、シートモジュールに記載すればよろしいでしょうか?

シートモジュールに書くとシートモジュールに記述されたイベント等からしか呼び出せません。そのため、ユーザーフォームモジュールとシートモジュールの両方から呼び出す必要のある変数は、標準モジュールにパブリック宣言で書く必要があります。

具体的に、前回私が回答した1の処理で言えば、bufはフォームモジュールからしか呼び出さないので、フォームモジュールでも標準モジュールでもどちらでも良いですが、Rngはシートモジュールからも呼び出すので、標準モジュールに書く必要があります。

3 / 13196 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free