Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Home Premium : Excel 2010)
ユーザーフォーム内のTextBoxにセルの値を取得させる
投稿日時: 18/05/13 18:26:55
投稿者: tokuto

お世話になっております。
 
userform1に配置したTextBoxとコマンドボタンを使用した
日付選択のマクロを作成しています。
セル値の取得方法についてアドバイスの程お願いします。
 
 
下記は、シート内のセルをコマンドボタン押す毎に1行づつセル移動し選択セルの値を
TextBoxに表示(日付)させるものです。
 
private Sub 処理_戻る_Click()
 
    Dim rng As Range
    Set rng = ActiveCell
    rng.Offset(1, 0).Select
    TextBox1.Value = rng.Text
End Sub
 
上記は、アクティブセルを対象としておりますが、
 
これを、値のあるセル範囲(A10:A15)に限定し
かつ、その値を取得するシートが非表示でも値を取得できるようにしたいと考えております。
 
なお、上記は下に1行づつ進むOffset(1, 0)ながら値を取得するものですが
もう一つコマンドボタンを配置して上に1行つづ戻るOffset(-1, 0)コードも習って作成します。
 
どうかアドバイスの程よろしくお願い致します。

回答
投稿日時: 18/05/13 19:23:22
投稿者: simple

こんにちは。
 
お尋ねします。
その処理の目的は何ですか?
 
ユーザーはどのようにして、目的のセルを指定するのですか?
見えてないものをどうやって判別するんですか?
 
最初から、非表示の特定セル範囲の値を、
一括してリストボックスか何かに表示しておいて、
そこから選択したらまずいのですか?

回答
投稿日時: 18/05/13 19:23:41
投稿者: K.Hiwasa
投稿者のウェブサイトに移動

こんばんは。
 
セルをSelectする場合、そのセルを含んでいるシートをSelectする必要がありますが、
シートが非表示だとSelectできません。
シートが非表示でも動作させるためには、Selectを使わないようにする必要があります。
 
UserForm1のモジュールレベル変数として現在の位置を保存しておき、
A10:A15の範囲の中で位置を+1またはー1してずらしていけばよいでしょう。
 
UserForm1のあるブックの1シート目のA10:A15が取得元として、
CommandButton1が下に進む方で、CommandButton2が上に戻る方の場合、
以下のようなコードになります。
 
UserForm1のコード

Option Explicit
Dim idx As Long

Private Sub CommandButton1_Click()

    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets(1)
    Set rng = ws.Range("A10:A15")

    If idx < rng.Cells.Count Then
       idx = idx + 1
       Me.TextBox1.Value = rng.Cells(idx).Text
    End If

    Set rng = Nothing
    Set ws = Nothing

End Sub

Private Sub CommandButton2_Click()

    Dim ws As Worksheet
    Dim rng As Range

    Set ws = ThisWorkbook.Worksheets(1)
    Set rng = ws.Range("A10:A15")

    If idx > 1 Then
       idx = idx - 1
       Me.TextBox1.Value = rng.Cells(idx).Text
    End If

    Set rng = Nothing
    Set ws = Nothing

End Sub

回答
投稿日時: 18/05/13 22:18:33
投稿者: WinArrow
投稿者のウェブサイトに移動

非表示のシートの特定セル範囲のデータを任意に選択して
○○〜〜を実施する
ような場合、
 
テキストボックスではなく、コンボボックスを使うと便利です。
 
方法は、いくつかありますが、
 
一例として
Private Sub UserForm_Initialize()
    With Sheets("非表示シート名")t
        Me.ComboBox1.List = .Range("A10:A15").Value
    End With
End Sub
 
こんな感じにすると
コンボボックスのドロップダウンリストに
セルの値がセットされます。
 
このようにすれば、見えないシートのデータが見えるようになります。
 

投稿日時: 18/05/14 09:06:14
投稿者: tokuto

皆様ありがとうございます。
 
使用目的は、日付に対する処理の際に、TextBoxに処理月を入力してもらうと
ミスが有るため、予めマスタシートに入力しておいた日付一覧を読み込もうと考えました。
 
リストボックスやコンボボックスも考えたのですが、
TextBoxとコマンドボタンを配置してコマンドボタンを押すことで
前月、当月、次月と選べるようにしたらかっこいいかなと思い質問をいたしました。
 
皆様のアドバイスのように、SELECTせずに、予めリストを読み込んでそれを順次選べるようにすればいいことを見落としていました。
 
K.Hiwasaさんのサンプルコードで思った通り動作しております。
 
少し欲をだして、WinArrowさんが言うようにコンボボックスとコマンドボタンの見合わせで、単月単位は、コマンドボタンで一つつづ選べるように、離れた月を選ぶ際には、いちいちボタンを押すのは面倒なので、コマンドボタンで一気にドロップダウンりすとから選ぶという使い方も検討したいと思います。
 
皆様ありがとうございます。解決しました。

投稿日時: 18/05/15 09:05:18
投稿者: tokuto

皆様おかげで、解決しましたことご報告します。