Excel VBA質問箱 IV

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

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


2322 / 13644 ツリー ←次へ | 前へ→

【68733】取得した値をシートに書きこむには にしもり 11/4/12(火) 18:16 質問[未読]
【68734】Re:取得した値をシートに書きこむには UO3 11/4/12(火) 18:39 発言[未読]
【68737】Re:取得した値をシートに書きこむには にしもり 11/4/13(水) 12:03 質問[未読]
【68738】Re:取得した値をシートに書きこむには にしもり 11/4/13(水) 12:14 発言[未読]
【68739】Re:取得した値をシートに書きこむには にしもり 11/4/13(水) 12:30 質問[未読]
【68742】Re:取得した値をシートに書きこむには UO3 11/4/13(水) 14:19 質問[未読]
【68743】Re:取得した値をシートに書きこむには にしもり 11/4/13(水) 14:51 お礼[未読]

【68733】取得した値をシートに書きこむには
質問  にしもり  - 11/4/12(火) 18:16 -

引用なし
パスワード
   こんにちは。
以下のことをしたいです。

Sheet1のB5以下B31まで人の名前が並んでいます。

いま、userformでcomboboxを作成し、RawsourceにB5:B31とし、一人を選びます。
次にcomboboxの下にテキストボックスを作成し、たとえば123456という数字をいれます。
userformのEnterボタンを押すと、Sheet1の、選んだのと同じ名前から始まって右5個offsetしたところ、
つまり当該行のG列に123456という値を入れます。

そのとき、当該行のG列にはすでに値が埋まってEmptyでない場合があります。
Emptyでなければさらに右に1個offsetして当該行のH列に123456という値を入れます・・・・
ということを値が入るまでル―プさせます。

なおuserformにはResetボタンをもうけ、Rawsourceから選んだ名前と、テキストボックスに入れた数字をクリアすることができるようにしたいです。

ここまでやりましたが後が続きません。
どこをどうるればいいかどなたか是非アドバイスをお願いいたします。

Option Explicit

Public m As Long
Public n As Long
Public ws1 As Worksheet

Private Sub ComboBox1_Change()

End Sub

Private Sub CommandButton1_Click()

Me.ComboBox1.rawsource = Worksheets("Sheet1").Range("b5:b31").Address(external:=True)
Set ws1 = Worksheets("Sheet1")

m = 5
n = 5

For m = 5 To 31
If Me.ComboBox1.Value = ws1.Cells(m, n).Value Then

  For n = 5 To ws1.Range("G5").End(xlToRight).Column
    If ws1.Cells(m, n).Value = Empty Then
    ws1.Cells(m, n).Value = Me.TextBox1.Value
    End If
  Next n

End If
Next m

End Sub

Private Sub CommandButton2_Click()
  Me.ComboBox1.Value = False
  Me.TextBox1.Value = False
End Sub

【68734】Re:取得した値をシートに書きこむには
発言  UO3  - 11/4/12(火) 18:39 -

引用なし
パスワード
   ▼にしもり さん:

こんにちは

コードはよく読んでいませんが、ヒントになれば。

まず、 CommandButton1_Click() で、ComboBox1.ListIndex を判定します。
これは、リストの(0から数えて)何番目の値が選ばれているかという情報です。
0なら1番目、3なら4番目、選ばれていないときは -1 になっています。

で、これが 3 ということは B5:B31 の中の 4番目ということですから B8 ですね。
つまり、選んだものの行は、ループで比較しなくても ComboBox1.ListIndex + 5
というふうに把握できます。(もちろん -1 なら選ばれていないので留意願います)

で、次に、n行目のG列以降の一番右のフリーのセルの取得ですね。
このセルの列番号は
    x = Cells(ComboBox1.ListIndex + 5, Columns.Count).End(xlToLeft).Column
    If x < 7 Then
      x = 7
    Else
      x = x + 1
    End If
というように取得できます。

【68737】Re:取得した値をシートに書きこむには
質問  にしもり  - 11/4/13(水) 12:03 -

引用なし
パスワード
   ▼UO3 さん:
ありがとうございます。その前に一寸Userformについて質問させてください。

Private Sub UserForm1_initialize()

Me.ComboBox1.RowSource = Worksheets("Sheet1").Range("b5:b31").Address(external:=True)

End Sub

と記述したのですが、comboboxに何も表示されません。
名称もComboBox1で合っています。
どこがいけないでしょうか・

【68738】Re:取得した値をシートに書きこむには
発言  にしもり  - 11/4/13(水) 12:14 -

引用なし
パスワード
   Private Sub UserForm1_initialize()でなく、
Private Sub UserForm_initialize()にしたらできました。
失礼しました。

【68739】Re:取得した値をシートに書きこむには
質問  にしもり  - 11/4/13(水) 12:30 -

引用なし
パスワード
   お陰さまでここまで書けました。
だた、止まってしまいます。
すみません、どうすればいいかご教示ください。

Option Explicit
Public m As Long
Public n As Long
Public ws1 As Worksheet

Private Sub UserForm_Initialize()

Me.ComboBox1.RowSource = Worksheets("Sheet1").Range("b5:b31").Address(external:=True)

End Sub

Private Sub ComboBox1_Change()

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub CommandButton1_Click()

m = ComboBox1.ListIndex + 5
n = Cells(ComboBox1.ListIndex + 5, Columns.Count).End(xlToLeft).Column

If n < 7 Then
  n = 7
Else
  n = n + 1
End If

With ActiveCell
  ws1.Cells(m, n).Value = Me.TextBox1.Value '<=with ブロック変数なしと出てここで止まってしまいます
End With

End Sub

Private Sub CommandButton2_Click()
  Me.ComboBox1.Value = False
  Me.TextBox1.Value = False
End Sub

【68742】Re:取得した値をシートに書きこむには
質問  UO3  - 11/4/13(水) 14:19 -

引用なし
パスワード
   ▼にしもり さん:

>お陰さまでここまで書けました。
>だた、止まってしまいます。

>>  ws1.Cells(m, n).Value = Me.TextBox1.Value '<=with ブロック変数なしと出てここで止まってしまいます

このエラーは、ws1 になにもセットされていないのが理由でしょうね。
そのほかに、先に申し上げた留意点、コンボボックスが選ばれていない場合
ComboBox1.ListIndexが -1 になっていて、これはこれで、ws1 に値が入っていても
別のエラーになりますね。

ユーザーフォームモジュールでPublic変数の宣言をしているところ他、
ちょっと添削してみました。

Option Explicit

Dim ws1 As Worksheet

Private Sub UserForm_Initialize()
  Set ws1 = Sheets("Sheet1")  'ws1ってSheet1なんですよね?
  ComboBox1.RowSource = ws1.Range("b5:b31").Address(external:=True)
End Sub

Private Sub CommandButton1_Click()
Dim m As Long
Dim n As Long

  With ComboBox1
 
    If .ListIndex < 0 Then
      MsgBox "まだ値が選択されていません"
      Exit Sub
    End If
  
    m = .ListIndex + 5
    n = Cells(.ListIndex + 5, ws1.Columns.Count).End(xlToLeft).Column
  
    If n < 7 Then
      n = 7
    Else
      n = n + 1
    End If
  
    ws1.Cells(m, n).Value = TextBox1.Value
    
  End With
 
End Sub

Private Sub CommandButton2_Click()
  ComboBox1.Value = "" 'False は具合悪いでしょ?
  TextBox1.Value = ""
End Sub

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

【68743】Re:取得した値をシートに書きこむには
お礼  にしもり  - 11/4/13(水) 14:51 -

引用なし
パスワード
   ▼UO3 さん:
ありがとうございます。動きました。

投稿後に調べてSetが抜けていることが分かりました。
また、ws1はSheet1です。
失礼しました。

ComboBox1.ListIndexが -1 になっているとは、そういうことなのですね。
折角留意点を教えていただいたのに解っていませんでした。

リセットボタンはとりあえずFalseにしたまま投稿してしまいました。

またも未熟さを露呈してしまいました・・・。
深く感謝いたします。

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