Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Microsoft 365)
コンボボックス
投稿日時: 23/02/18 21:03:23
投稿者: レンタルネコ

コンボボックスで入力したデータが、シートに反映されません。
フォームに、印刷ボタンを配置。
データ5名分(コンボボックス1〜5)を入力して登録後、印刷ボタンを押すと印刷プレビューが開くのですが、コンボボックス1のデータのみプレビューで確認でき入力データ2〜5のデータが、反映されません。
フォームをいったん閉じてのシートをクリックさせたりしたら5人分のデータはちゃんとシートに反映されてます。
フォームに入力した後、そのままボタンを押して、プリントプレビュー後シートを印刷するにはどうしたらいいのでしょうか。
よろしくお願いします。

回答
投稿日時: 23/02/18 21:25:37
投稿者: WinArrow
投稿者のウェブサイトに移動

文章だけで、推測することはできないので、
コンボボックスに関するコードを、全部、掲示して貰えませんか?

投稿日時: 23/02/18 22:10:06
投稿者: レンタルネコ

WinArrow様
コメントありがとうございます。
VBA初心者で見よう見まねで作成したので
わかりにくいかとも思いますが貼付します。
コンボボックス入力は5名分ありますが
同じ処理の繰り返しなので3名〜5名は省略いたします。
どうぞよろしくお願いします。
 
Private Sub CommandButton1_Click() 'データ登録
Dim i As Integer
Dim ws(4) As Worksheet
Dim hizuke As Date
Dim kaisi(1) As Date
Dim owari(1) As Date
Dim namae(4) As String
Dim a As Long
Dim mydate As Long
Dim g As Long
 
hizuke = ComboBox7.Value  '残業日付
kaisi(0) = ComboBox8.Value '残業開始時間
owari(0) = ComboBox9.Value '残業終了時間
namae(0) = ComboBox1.Value '名前1
Set ws(0) = Worksheets(namae(0))  '各シート名前つきです
mydate = DateSerial(Year(hizuke), Month(hizuke), Day(hizuke)) '残業日付と各シートの日付
For g = 16 To ws(0).Cells(Rows.Count, 1).End(xlUp).ROW を検索してセルに
    If ws(0).Cells(g, 1).Value = mydate Then          開始時間と終了時間を
Sheets(namae(0)).Cells(g, 6) = kaisi(0)            転記。1名の時もあれば
Sheets(namae(0)).Cells(g, 9) = owari(0)            6名の時もあります
    End If
Next g
Unload Me
Worksheets("Sheet1").Select
UserForm1.Show
 
hizuke = ComboBox7.Value
kaisi(0) = ComboBox8.Value
owari(0) = ComboBox9.Value
namae(1) = ComboBox2.Value
Set ws(1) = Worksheets(namae(1))
mydate = DateSerial(Year(hizuke), Month(hizuke), Day(hizuke))
 For g = 16 To ws(1).Cells(Rows.Count, 1).End(xlUp).ROW
    If ws(1).Cells(g, 1).Value = mydate Then
Sheets(namae(1)).Cells(g, 6) = kaisi(0)
Sheets(namae(1)).Cells(g, 9) = owari(0)
    End If
Next g
Unload Me
Worksheets("Sheet1").Select
UserForm1.Show
 
 
 
Private Sub CommandButton3_Click() '一括印刷
UserForm1.Hide
Sheets(Array("山田", "田中", "山本", "鈴木", "谷")).PrintPreview ←仮名です
UserForm1.Show
End Sub

回答
投稿日時: 23/02/18 23:42:28
投稿者: WinArrow
投稿者のウェブサイトに移動

よくわからいけど・・・
 
CommandButton1_Click
のプロシジャyの中に
Unoad

Show
が2回記述されいますよね?、
1回目のShowの後のコードは実行されていないと思いますが、
確認できますか?
 
確認方法は、ステップ実行をやってみることです。
 

投稿日時: 23/02/19 00:48:20
投稿者: レンタルネコ

WinArrow様
 
返信ありがとうございます。
UnoadとShowを最後だけに記述したら
プレビューで5人分のデータ確認できましたが
1名だけ登録時には「インデックスが有効範囲にありません」エラーがでます。
 
5個のコンボボックスにきっちり5名分のデータを登録すればいいのですが
5名以外の時にはエラーがでるみたいです。

回答
投稿日時: 23/02/19 09:45:54
投稿者: WinArrow
投稿者のウェブサイトに移動

レンタルネコ さんの引用:

5個のコンボボックスにきっちり5名分のデータを登録すればいいのですが
5名以外の時にはエラーがでるみたいです。

 
コンボックスが選択されているか確認すれば、よいだけです。
 
そもそもですが、
5個のコンボボックスが何故必要なんでしょうか?
仮に5名以上の増えたらどうしますか?
 
1つのコンボボックスで、ドロップダウンリストに5名(正確には、シート名)を
設定すれば、選択されなかった人は、転記処理が実行されないことになる
と考えると、コンボボックスの意義が見えてきます。
 
変数を配列設定していることも、理解できないところです。
 
>mydate = DateSerial(Year(hizuke), Month(hizuke), Day(hizuke))
↑のコードも、処理上間違っているわけではないが、不可思議なコードですね・・・・
 
変数:hizuzke
は、データ型がDateです。
それを「年」「月」「日」に分解して、
データ型:Longの変数に代入している。
わざわざ、mydate でなくても
>If ws(0).Cells(g, 1).Value = mydate Then
のコードで
If ws(0).Cells(g, 1).Value = hizuke Then
とすればよいだけです。

回答
投稿日時: 23/02/19 09:53:51
投稿者: WinArrow
投稿者のウェブサイトに移動

データ登録(シートに転記)後
Unlod

Show
を実行する意図は、何処にあるんでしょうか?

投稿日時: 23/02/19 10:55:32
投稿者: レンタルネコ

WinArrow様
 
返信、ご指摘ありがとうございます。
5個必要なのは班(最高5名)で残業をするからです。
1名ですることはあっても6名ですることはないので固定にしました。
 
ご指摘の日付は当初、ws(0).Cells(g, 1).Value = hizuke Thenで試したときにうまくいかなかったので
シリアル値が関係してるのかと思いあんな処理になりました。
今、試したらws(0).Cells(g, 1).Value = hizuke でうまくいきました。
 
配列も
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Dim ws4 As Worksheet
Dim ws5 As Worksheet で記述しておりましたが長いので訳が分からず配列形式にして見ました。
動いていたのでそのままに使用してました。
 
また、一から考え直します。
その時はよろしくお願いします。

投稿日時: 23/02/19 11:03:03
投稿者: レンタルネコ

 
一度閉じて、再表示してみればプレビューで表示されるかなと思いまして。

回答
投稿日時: 23/02/19 14:45:15
投稿者: WinArrow
投稿者のウェブサイトに移動

5名の件は了解しました。
 
しかし、現在のコードでは、
1番目の人が、必ず、残業することになっていませんか?

投稿日時: 23/02/19 15:59:38
投稿者: レンタルネコ

1番目の人と言うより最低ひとりは残業してます。
 
"Sheet1"に25人分の名前データを入力してます。
 
各コンボボックスで表示選択しています。

回答
投稿日時: 23/02/20 16:19:49
投稿者: WinArrow
投稿者のウェブサイトに移動

>印刷プレビュー
に関して
 
ユーザーフォームを表示した状態で、
印刷プレビューは表示かのですが、
印刷プレビューのボタンの操作ができなくなるので、
ユーz-フォームを非表示(Hide)する方法で対応しているものと思います。
少し観点を変えて、
PDFで出力して、確認する方法を採用したらいかがでしょう?
 
「名前を付けて保存」で、
ファイルの種類:Pdfを指定、
発行後にファイルを開くにチェックを入れる
で、すぐに印刷状態が確認できます。
マクロの記録でコードを作成するとよいでしょう。
ユーザーフォームを非表示にする必要はありません。

投稿日時: 23/02/20 22:20:49
投稿者: レンタルネコ

WinArrow様
 
ご助言ありがとうございます。
PDFで出力やってみます。
修正でき次第コメント致します。
まずはお礼まで。

トピックに返信