Excel VBA質問箱 IV

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

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


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

【56363】シートのA列セル選択右クリックでTextBoxとComboBoxへのデータ移動 おじさん46 08/6/15(日) 12:54 質問[未読]
【56385】Re:シートのA列セル選択右クリックでTextB... Abebobo 08/6/16(月) 9:38 発言[未読]
【56387】Re:シートのA列セル選択右クリックでTextB... kanabun 08/6/16(月) 10:19 発言[未読]
【56416】Re:シートのA列セル選択右クリックでTextB... おじさん46 08/6/16(月) 20:49 発言[未読]
【56420】Re:シートのA列セル選択右クリックでTextB... kanabun 08/6/16(月) 22:49 発言[未読]
【56424】Re:シートのA列セル選択右クリックでTextB... Abebobo 08/6/17(火) 9:08 お礼[未読]
【56430】Re:シートのA列セル選択右クリックでTextB... kanabun 08/6/17(火) 10:36 発言[未読]
【56431】Re:シートのA列セル選択右クリックでTextB... Abebobo 08/6/17(火) 10:44 お礼[未読]
【56454】Re:シートのA列セル選択右クリックでTextB... おじさん46 08/6/17(火) 20:10 発言[未読]
【56672】Re:シートのA列セル選択右クリックでTextB... おじさん46 08/6/29(日) 18:29 お礼[未読]
【56396】Re:シートのA列セル選択右クリックでTextB... Abebobo 08/6/16(月) 12:14 発言[未読]

【56363】シートのA列セル選択右クリックでTextBo...
質問  おじさん46  - 08/6/15(日) 12:54 -

引用なし
パスワード
   Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'A列セル選択右クリックでセルデータ収集後フォームを開く
Dim r As Range
Dim i As Single
If Target.Column <> 1 Then Exit Sub
If Target.Row = 1 Then Exit Sub
Cancel = True

UserForm1.Show 0

i = 1
For Each r In Target.Offset(, 1).Resize(, 6)
  UserForm1.Controls("TextBox" & i).Text = r.Value
  i = i + 1
Next r
End Sub

シートの該当行のA列セル選択右クリックでUserForm1上の各TextBoxにセルのデータを移動(転記)する上記のコードと、

Private Sub TextBox7_AfterUpdate()
'行番号入力でセルデータ収集
Dim t7 As Long
Dim i  As Long
  t7 = Me.TextBox7.Text
  i = 1
    For i = 1 To 6
    Me.Controls("textbox" & i).Text = ActiveSheet.Cells(t7, i + 1).Value
    Next i
    ActiveSheet.Cells(t7, 1).Select

  TextBox7.SetFocus
 
End Sub

もうひとつ、UserForm1上のTextBox7に行番号を入力して同様の結果がでるコードを教えてもらいました。
そして、自分なりに改良して7つあるTextBoxの内、2つをComboBoxへ変更したいと思い試行錯誤をしましたが、うまくいきません。
どう考えたらよいかご指導をお願いします。
全体の流れは、
vbalab.net/vbaqa/c-board.cgi?cmd=one;no=55757;id=excel
を参照してもらえばわかると思いますが、
データシートにある希望するその行のデータをフォームに表示し、
そのフォーム上で必要なTextBoxの項目に修正を加え、
印刷シートにフォーム上のTextBoxのデータを落として、
その印刷シートを印刷しようとしています。
よろしくお願いします。

【56385】Re:シートのA列セル選択右クリックでTex...
発言  Abebobo  - 08/6/16(月) 9:38 -

引用なし
パスワード
   おじさん46 さん おはようございます。

今回の質問内容は、チョット解りかねます。(私だけかもしれませんが)

Private Sub CommandButton1_Click()
Dim A_str  As String

A_str = Me.ComboBox1.Text

If A_str = "" Then
 MsgBox "ComboBox1 未選択"
 Me.ComboBox1.SetFocus
End If

Sheet1.Range("F1").Value = Me.ComboBox1.Text
End Sub

 ↑ コンボボックス1にデータが選択されているかを判断して、選択忘れなら戻る、そうでなければ [F1] に転記

のような事じゃないですよね?
とりあえず、私が今勉強しているサイトのご紹介。

://www6.plala.or.jp/MilkHouse/inexper/contents104/contents10402.html

【56387】Re:シートのA列セル選択右クリックでTex...
発言  kanabun  - 08/6/16(月) 10:19 -

引用なし
パスワード
   おじさん46 さん、Abebobo さん、こんにちは。
おじゃまします。

> 7つあるTextBoxの内、2つをComboBoxへ変更したい
↑この文章の解釈ですが、
たとえば、
   TextBox2 を → ComboBox1 に、
   TextBox3 を → ComboBox2 に、
変更ということだとすると、
Select Case 文で分岐すればよいと思います。
(まったくの解釈違いなら、以下は無視してください)

----------------------------------------------
まず、UserFormのほうの
> Private Sub TextBox7_AfterUpdate()
> '行番号入力でセルデータ収集
ですが、変数の宣言を以下のようにして、
 Dim 行番号 As Long
 Dim Target As Range
 Dim i  As Long
 Dim myValue As String
 
番号i によるテキストボックスまたはコンボボックスへのセル値の転記
は以下のようにしてみてはどうでしょう?

 行番号 = Val(Me.TextBox7.Text)
 'Rangeオブジェクト変数 Target に指定セルをセットする
 Set Target = ActiveSheet.Cells(行番号, 1)
 For i = 1 To 6
   myValue = Target.Offset(, i).Value
   Select Case i
    Case 2
      Me.ComboBox1.Text = myValue
    Case 3
      Me.ComboBox2.Text = myValue
    Case Else
      Me.Controls("textbox" & i).Text = myValue
   End Select
 Next i
 Target.Select

End Sub

もし、こういうことでよかったら、
シートのほうのA列 右クリック時の処理も同様に書き換えます。
----------------------------------------------
'シートの該当行のA列セル選択右クリックで
' UserForm1上の各TextBoxにセルのデータを移動(転記)するコード

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'A列セル選択右クリックでセルデータ収集後フォームを開く
 Dim r As Range
 Dim i As Long
 Dim myValue As String
 
 If Target.Column <> 1 Then Exit Sub
 If Target.Row = 1 Then Exit Sub
 
 Cancel = True
 Set Target = Target.Item(1)
 With UserForm1
   .Show 0
   .Caption = Target.Text
   For i = 1 To 6
     myValue = Target.Offset(, i).Value
     Select Case i
      Case 2
        .ComboBox1.Text = myValue
      Case 3
        .ComboBox2.Text = myValue
      Case Else
        .Controls("textbox" & i).Text = myValue
     End Select
   Next i
 End With
End Sub

----------------------------------------------
よくみると、UserForm1 のほうでの転記処理と、
シートの右クリック時の転記処理部分は同じ処理をしていることが
分かります。
そういうときは、(つぎにまた コントロールなどに変更が
あったとき、2か所を変更しなければならないので)どこか
一箇所に書いておいて、それをUserForm1の
TextBox7_AfterUpdateと、シートの右クリックから呼び出せる
ように、まとめたほうがあとあとのメンテナンスが楽というこ
とが分かってきますが、、それはま、次のステップということ
で。。。(^^

【56396】Re:シートのA列セル選択右クリックでTex...
発言  Abebobo  - 08/6/16(月) 12:14 -

引用なし
パスワード
    おじさん46 さん、kanabun さんこんにちは

・数量の入力にスピンボタンを使う
ユーザーフォーム上にスピンボタンを配置
ユーザーフォームのモジュールに

Private Sub SpinButton1_SpinUp()
  TextBox4.Value = TextBox4.Value + 1 
  TextBox6.Value = TextBox4.Value * TextBox5.Value ’金額の再計算
End Sub
Private Sub SpinButton1_SpinDown()
  TextBox4.Value = TextBox4.Value - 1
  TextBox6.Value = TextBox4.Value * TextBox5.Value ’金額の再計算
End Sub

TextBox4=数量 TextBox5=単価 TextBox6=金額 でしたよね。

スピンボタンについては ↓
://excelvba.pc-users.net/fol10/10_6.html

【56416】Re:シートのA列セル選択右クリックでTex...
発言  おじさん46  - 08/6/16(月) 20:49 -

引用なし
パスワード
   ▼kanabun さん Abebobo さん:こんばんは。

Abebobo さん、ありがとうございます。
私が教えてほしかったのは、kanabun さんの方です。
でも参考にしますのでありがとうございます。


kanabun さん
膨大な資料をありがとうございます。
今から自分なりに分析します。

また、後ほど連絡します。

【56420】Re:シートのA列セル選択右クリックでTex...
発言  kanabun  - 08/6/16(月) 22:49 -

引用なし
パスワード
   ▼おじさん46 さん:
こんばんは。

> 膨大な資料をありがとうございます。

いえいえ、膨大ではないです。けれど、ぼくも冗長と感じます。
その原因は、前述のように、シートとUserForm1とで、同じような処理を
2度書いているからです。
UserFormのコントロール名を変えたりすると、今のままでは
修正を2か所にたいして実行しないといけない。これは面倒だし、
どこを修正しなければならないか、そのうち忘れてしまう恐れが
あります。

現行の流れが分かったところで、
> 次のステップ
として、共通処理をサブルーティンとして独立させてみましょう。

たとえば、
標準モジュールに、
>-------------------------------------------------------
'        Target: 転記するシートのA列のセル
'        Uf  :転記先のユーザーフォーム
Sub UserFormに転記1(ByVal Target As Range, ByVal Uf As MSForms.UserForm)
 Ufの Caption に Target の値を書き込む
 1〜6番までループして
   番号別に Target.Offset(, i).Value の値を
   指定のコントロールに書き込む処理を
   ( Private Sub TextBox7_AfterUpdate() からコピー編集して)
   ここに書き込む
End Sub

と、独立させておくと、
>-------------------------------------------------------
> Private Sub TextBox7_AfterUpdate()
のほうは、
 Dim 行番号 As Long
 Dim Target As Range
 
 行番号 = Val(Me.TextBox7.Text)
 Set Target = ActiveSheet.Cells(行番号, 1)
 UserFormに転記 Target, Me  '◆サブ呼び出し
 Target.Select
End Sub
だけになり、

シートのほうも、
>-------------------------------------------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
'A列セル選択右クリックでセルデータ収集後フォームを開く
 
 If Target.Column <> 1 Then Exit Sub
 If Target.Row = 1 Then Exit Sub
 
 Cancel = True
 Set Target = Target.Item(1)
 UserForm1.Show vbModeless
 UserFormに転記 Target, UserForm1 '◆サブ呼び出し
 UserForm1.TextBox7.Text = Target.Row
End Sub

だけで済むことになります。そして、基本的には、メンテナンスは
呼び出し先の(標準モジュールに書いた)『UserFormに転記』を
編集すれば済むことになります。

たとえば、こんな風に、
'------------------------------------------------- 標準モジュール
Sub UserFormに転記(ByVal Target As Range, ByVal Uf As MSForms.UserForm)
 Dim i As Long
 Dim myValue As String
 Dim ACtrl  'A列からのOffset番号に対応する書き込み先のControl名の配列
 ACtrl = Array("", "TextBox1", "ComboBox1", "ComboBox2", _
          "TextBox4", "TextBox5", "TextBox6")
 
 Uf.Caption = Target.Value
 For i = 1 To 6
   Uf.Controls(ACtrl(i)).Text = Target.Offset(, i).Value
 Next i

End Sub

【56424】Re:シートのA列セル選択右クリックでTex...
お礼  Abebobo  - 08/6/17(火) 9:08 -

引用なし
パスワード
   kanabun さん おはようございます。
私も参考にします。

>Sub UserFormに転記(ByVal Target As Range, ByVal Uf As MSForms.UserForm)

こういう()の中に自分で書くのは見たこと有るだけで、やったことなかったんです。
ご存知であれば、この書き方の名前とかから説明されてるサイト等を教えていただけたら幸いです。

【56430】Re:シートのA列セル選択右クリックでTex...
発言  kanabun  - 08/6/17(火) 10:36 -

引用なし
パスワード
   ▼Abebobo さん:
こんにちは。

>>Sub UserFormに転記(ByVal Target As Range, ByVal Uf As MSForms.UserForm)
>
>こういう()の中に自分で書くのは見たこと有るだけで、やったことなかったんです。
>ご存知であれば、この書き方の名前とかから説明されてるサイト等を教えていただけたら幸いです。

とりあえず、ヘルプの目次から
▼Visual Basic プログラミングのヒント
  ▼ Sub プロシージャと Function プロシージャの呼び出し
とか
  ▼ 引数の効率的な引き渡し

あたりでしょうか?

【56431】Re:シートのA列セル選択右クリックでTex...
お礼  Abebobo  - 08/6/17(火) 10:44 -

引用なし
パスワード
   kanabun さん ありがとうございます。
私でも比較的解りやすいヘルプでした。

これで、便乗質問をやめます。おじさん46さんすみませんでした。

*Prompt:="現在の給与に満足していますか ?", Buttons:=4)
ちょっと、具体的な例ですね。 ちなみに私は △ かな

【56454】Re:シートのA列セル選択右クリックでTex...
発言  おじさん46  - 08/6/17(火) 20:10 -

引用なし
パスワード
   ▼kanabun さん:こんばんわ。

わたくし事で申し訳ございません。
ちょっとPowerPointと、たわむれないといけなくなったので、
すみません。間をあけますので勘弁してください。
終わったら連絡します。

【56672】Re:シートのA列セル選択右クリックでTex...
お礼  おじさん46  - 08/6/29(日) 18:29 -

引用なし
パスワード
   kanabunさん お久しぶりです。

出来ました。
ありがとうございます。
これは、応用が聞きますね。
コードがシンプルになりました。
これからもよろしくお願い致します。

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