Excel VBA質問箱 IV

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

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


2422 / 13645 ツリー ←次へ | 前へ→

【68105】フォームに表示するシートを固定する ケイ 11/2/2(水) 16:41 質問[未読]
【68107】Re:フォームに表示するシートを固定する [名前なし] 11/2/2(水) 20:20 発言[未読]
【68115】Re:フォームに表示するシートを固定する ケイ 11/2/3(木) 10:06 質問[未読]
【68119】Re:フォームに表示するシートを固定する UO3 11/2/3(木) 11:13 回答[未読]
【68123】Re:フォームに表示するシートを固定する とおりすがり 11/2/3(木) 13:55 回答[未読]
【68124】Re:フォームに表示するシートを固定する UO3 11/2/3(木) 14:21 発言[未読]
【68125】Re:フォームに表示するシートを固定する ケイ 11/2/3(木) 14:22 質問[未読]
【68126】Re:フォームに表示するシートを固定する UO3 11/2/3(木) 15:22 回答[未読]

【68105】フォームに表示するシートを固定する
質問  ケイ E-MAIL  - 11/2/2(水) 16:41 -

引用なし
パスワード
   フォームについて、教えていただきたいのですが、
あるExcelのデータ一覧が横長で見づらいので、行の内容が一目でわかるようにフォームを作成しました。これをSheet1とします。
フォーム上には「上の行へ」、「下の行へ」と行を移動できるコマンドを設けました。
そのフォーム内に別シートへの切り替えというコマンドを設けて、フォームを開きながら別シートへ切り替えるコマンドを作成しました。別シートをSheet2とします。

ここで、フォームを見ながらSheet2に移動してSheet2での作用を行いたいのですが、フォームの中身はSheet1の内容を参照したいので、フォームの中身はSheet1の内容に固定しておきたいのです。

このように固定するにはどうしたらよいのでしょうか。
ご教授いただけますでしょうか。
よろしくお願いいたします。

【68107】Re:フォームに表示するシートを固定する
発言  [名前なし]  - 11/2/2(水) 20:20 -

引用なし
パスワード
   ▼ケイ さん:

こんばんは

フォームとおっしゃるのはユーザーフォームですか?
それとも、データーフォーム あるいは・・・
フォームといっても、いろいろありますので。

【68115】Re:フォームに表示するシートを固定する
質問  ケイ E-MAIL  - 11/2/3(木) 10:06 -

引用なし
パスワード
   ▼[名前なし] さん:

ご返信ありがとうございました。
フォームというのはExcelのシートの中身を参照するために
作成したユーザーフォームです。

シート内のセルの内容をフォームのテキストボックスで表示しているのですが、
別シートに切り替えた時に、元々の参照元のシートの内容のまま別シートでの作業ができないかと方法を探しています。


>▼ケイ さん:
>
>こんばんは
>
>フォームとおっしゃるのはユーザーフォームですか?
>それとも、データーフォーム あるいは・・・
>フォームといっても、いろいろありますので。

【68119】Re:フォームに表示するシートを固定する
回答  UO3  - 11/2/3(木) 11:13 -

引用なし
パスワード
   ▼ケイ さん:

こんにちは

時折、ユーザーフォームモジュールが【特定のシート】配下にあるような
イメージをもたれる方がいらっしゃいますね。

エクセルVBAには様々なモジュールがあるわけですが、シートモジュール以外は
各シートは、それらモジュールから見て、【並列】です。
ですから、たとえば Range("A1").Value とだけ記述すると、
【たまたまその時にアクティブになっているシートのA1】を参照します。

複数シートがあり、つねに、ある特定のシートの値を参照する場合は
特定のシート.Range("A1").Value というように、【シート修飾】をしてやる
必要があります。

シート修飾はいろいろな記述方法がありますが、2つほど。

1)With を使います。セル範囲記述の前に .(ピリオド)を付加します。

  With Sheets("Sheet1")
   TextBox1.Value = .Range("A1").Value
   Label1.Caption = .Range("A2").Value
  End With

2)シートオブジェクトを使います。

  Dim sh As Worksheet
  Set sh = Sheets("Sheet1")
  TextBox1.Value = sh.Range("A1").Value
  Label1.Caption = sh.Range("A2").Value
  Set sh = Nothing

【68123】Re:フォームに表示するシートを固定する
回答  とおりすがり  - 11/2/3(木) 13:55 -

引用なし
パスワード
   Private Sht as Worksheet
Private Sub UserForm_Initialize()
Set Sht = activesheet
End Sub

のように広域なSheetObject変数に入れて、以後
RangeやCellsを扱うときはSheetObjectから記述する。

Sht.Range("A1").value="Hoge"

【68124】Re:フォームに表示するシートを固定する
発言  UO3  - 11/2/3(木) 14:21 -

引用なし
パスワード
   ▼とおりすがり さん:

ご指摘ありがとうございます。
実際には、このモジュール内の様々なプロシジャでシートを参照するんだろうと
思われますので、確かに最初にSetして、後は、それを使うというのがいいですね。

2つだけ。

最初のSet は 必ずしもActiveSheetではない可能性もありますから
ここは、明確に
Set Sht = Sheets("Sheet1") がよろしいでしょうね。

それと、一応【たしなみ】として、フォームを閉じる際に

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Set Sht = Nothing
End Sub

【68125】Re:フォームに表示するシートを固定する
質問  ケイ E-MAIL  - 11/2/3(木) 14:22 -

引用なし
パスワード
   ▼UO3 さん:

ご回答ありがとうございました。
フォームのテキストBOXにシートを指定することができました。
フォームで「次へ」ボタンを押すと行を移動するようにしていて、
移動先をアクティブセルとするように以下のようにSelectとしているのですが、別シートへ切り替えが時にこの次へボタンを押した時にそのシートではアクティブせるとしてSelectさせないようにさせるには、どうしたらよいでしょうか。
補足で申し訳ございません。

Dim データ行 As Ling

Private Sub cmdButton次_Click()

データ行 = データ行 + 1
Cells(データ行, 3).Select

End Sub

>▼ケイ さん:
>
>こんにちは
>
>時折、ユーザーフォームモジュールが【特定のシート】配下にあるような
>イメージをもたれる方がいらっしゃいますね。
>
>エクセルVBAには様々なモジュールがあるわけですが、シートモジュール以外は
>各シートは、それらモジュールから見て、【並列】です。
>ですから、たとえば Range("A1").Value とだけ記述すると、
>【たまたまその時にアクティブになっているシートのA1】を参照します。
>
>複数シートがあり、つねに、ある特定のシートの値を参照する場合は
>特定のシート.Range("A1").Value というように、【シート修飾】をしてやる
>必要があります。
>
>シート修飾はいろいろな記述方法がありますが、2つほど。
>
>1)With を使います。セル範囲記述の前に .(ピリオド)を付加します。
>
>  With Sheets("Sheet1")
>   TextBox1.Value = .Range("A1").Value
>   Label1.Caption = .Range("A2").Value
>  End With
>
>2)シートオブジェクトを使います。
>
>  Dim sh As Worksheet
>  Set sh = Sheets("Sheet1")
>  TextBox1.Value = sh.Range("A1").Value
>  Label1.Caption = sh.Range("A2").Value
>  Set sh = Nothing

【68126】Re:フォームに表示するシートを固定する
回答  UO3  - 11/2/3(木) 15:22 -

引用なし
パスワード
   ▼ケイ さん:

やりたいことを誤解しているかもしれませんが以下のようなことでしょうか?

Option Explicit

Private Sht As Worksheet
Private データ行 As Long

Private Sub UserForm_Initialize()
  Set Sht = Sheets("Sheet1")
End Sub

Private Sub cmdButton次_Click()
  If ActiveSheet.Name <> Sht.Name Then
   MsgBox "このシートでは、このボタンはおせません"
  Else
   データ行 = データ行 + 1
   Sht.Cells(データ行, 3).Select
  End If
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Set Sht = Nothing
End Sub

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