Excel VBA質問箱 IV

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

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


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

【34883】ユーザフォームを使い、指定した範囲に数字を入れる Ny 06/2/15(水) 20:16 質問[未読]
【34906】Re:ユーザフォームを使い、指定した範囲に... Kein 06/2/16(木) 0:23 回答[未読]
【34944】Re:ユーザフォームを使い、指定した範囲に... Kein 06/2/16(木) 16:33 発言[未読]
【34957】Re:ユーザフォームを使い、指定した範囲に... Ny 06/2/16(木) 21:00 お礼[未読]
【34959】Re:ユーザフォームを使い、指定した範囲に... Kein 06/2/16(木) 22:42 回答[未読]
【34972】Re:ユーザフォームを使い、指定した範囲に... Ny 06/2/17(金) 11:08 お礼[未読]

【34883】ユーザフォームを使い、指定した範囲に数...
質問  Ny  - 06/2/15(水) 20:16 -

引用なし
パスワード
   ユーザフォームのテキストボックスとコマンドボックスを使い
ある範囲に、順次数字を入力していく方法を教えてください。

入力は
B5⇒C5⇒D5⇒E5
B6⇒C6⇒D6⇒E6
B7⇒C7⇒D7⇒E7
のように順次セルに数字を入力したいのです。
一列だけであれば下のコードでいけるのですが
行が変わるときにどのようなコードを入れれば
良いのでしょうか。

Private Sub CommandButton1_Click()

Cells(2, 256).End(xlToLeft).Offset(, 1) = TextBox1.Value
TextBox1 = ""
TextBox1.SetFocus

End Sub

【34906】Re:ユーザフォームを使い、指定した範囲...
回答  Kein  - 06/2/16(木) 0:23 -

引用なし
パスワード
   Sheet1 に入力するとして・・

Private Sub CommandButton1_Click()
  Dim Txt As String
  Dim FR As Range

  Txt = TextBox1.Text
  If Txt = "" Then Exit Sub
  With Sheets("Sheet1")
   If IsEmpty(.Range("B5").Value) Then
     .Range("B5").Value = Txt: GoTo ELine
   End If
   Set FR = .Range("B5:E65536").Find("*", , xlValues)
  End With
  If FR.Column = 5 Then
   FR.Offset(1, -3).Value = Txt
  Else
   FR.Offset(, 1).Value = Txt
  End If
  Set FR = Nothing
ELine:
  With TextBox1
   .Text = ""
   .SetFocus
  End With
End Sub

で、どうでしょーか ?

【34944】Re:ユーザフォームを使い、指定した範囲...
発言  Kein  - 06/2/16(木) 16:33 -

引用なし
パスワード
   すいません。Findメソッドの引数の指定で、足りないものがありました。

Set FR = .Range("B5:E65536").Find("*", , xlValues, , , xlPrevious)

と、追加して下さい。

【34957】Re:ユーザフォームを使い、指定した範囲...
お礼  Ny  - 06/2/16(木) 21:00 -

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

ありがとうございました。帰宅してから質問をさせていただこうと思っていたのですが、
回答を寄せていただき感謝しています。
このコード実は小生理解が出来ません。よろしければコメントいただけませんでしょうか。もう少し理解を深めたいのですが。

実は、最初に頂いたコードを何とか上手く?修正が加えられないか会社でヘルプでfindを調べていたのですが…FindNext(after:=fc)やFindPrevious(after:=fc)の使用例が掲載されていましたが。
解決策の無いまま、の帰宅でした。ありがとうございました。

【34959】Re:ユーザフォームを使い、指定した範囲...
回答  Kein  - 06/2/16(木) 22:42 -

引用なし
パスワード
   コードの意味は、このようになります。

Private Sub CommandButton1_Click()
  Dim Txt As String
  Dim FR As Range

  Txt = TextBox1.Text
  If Txt = "" Then Exit Sub
  'テキストボックスの値を変数に入れる。
  'ついでにテキストボックスが未入力かどうか、チェックする。

  With Sheets("Sheet1")
  'Sheet1 内の処理について以下に記述する。

   If IsEmpty(.Range("B5").Value) Then
   'もし B5 セルが未入力なら・・

     .Range("B5").Value = Txt: GoTo ELine
     'B5 へテキストボックスの値を代入し、ラベル(ELine)へ飛ぶ。
     'B5 は入力範囲の先頭なので、そこが未入力なら以下の Findメソッド
     'の戻り値(FR)は必ず Nothing になってしまうため。

   End If
   Set FR = .Range("B5:E65536") _
   .Find("*", , xlValues, , , xlPrevious)
   'B5〜E列最終行までを入力範囲とし、そこで「右下から何かの値が入力
   'されているセル」を探す。つまりそこが最終入力セルになる。

  End With
  'Sheet1 の処理についてはここまで。

  If FR.Column = 5 Then
  'もし見つかったセルの列番号が 5 なら(つまりE列なら)・・

   FR.Offset(1, -3).Value = Txt
   'その位置から1行下 & 3列左のセルに変数の値を代入する。

  Else
  'E列以外なら・・

   FR.Offset(, 1).Value = Txt
   'その位置の右隣りのセルに代入する。

  End If
  Set FR = Nothing
  'オブジェクト変数と格納した値の関係を切断する。

ELine:
'ラベル

  With TextBox1
  'テキストボックスの処理について記す。

   .Text = ""
   '入力れている値を消す。

   .SetFocus
   'フォーカスを与える

  End With
  'テキストボックスについての記述は終わり。
End Sub

なお・・
>FindNext(after:=fc)やFindPrevious(after:=fc)の使用例が掲載
そのヘルプをよく読むと分かりますが、FindNext や FindPrevious は、
一度 Findメソッドで検索した後に、その条件の検索を継続するためのメソッド
なのです。
で、今回の処理では継続する必要がありませんから、そのようなメソッドは使って
いないのです。

【34972】Re:ユーザフォームを使い、指定した範囲...
お礼  Ny  - 06/2/17(金) 11:08 -

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

貴重な解説ありがとうございました。
Findメッソドのところが難しいですね。
自分でサンプルを作って、覚えるようにします。

大切な時間を割いていただきありがとうございました。
これからもよろしくご指導の程お願いいたします。
失礼します。

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