エクセルマクロで残業時間入力シートを作成しています。
1シートあたり8日分しか記載できないため、9日目以降は2枚目に書く必要があります。
下記のコードでは、1枚目が8日分(8行)埋まれば2枚目に移行し、2枚目も8日分(8行)埋まれば3枚目に移行するように組んでいるつもりです。
問題は、1枚目は上から順に8日分記載してくれるのですが、2枚目では記載する行が増えずに同じ行の上に上書きしてしまいます。つまり2枚目が埋まらないのです。下の方の「’出力行を増やす」が2枚目ではどうもうまく機能していないようです。
どのように改善すればよろしいでしょうか?ご指導のほどよろしくお願いします。
Sub 出力するコード()
Dim wsInput As Worksheet
Dim wsOutput As Worksheet
Dim wsOutput2 As Worksheet
Dim wsOutput3 As Worksheet
Dim LastRow As Long
Dim DateRange As Range
Dim WeekdayRange As Range
Dim AbsenceRange As Range
Dim WorkTypeRange As Range
Dim DepartureTimeRange As Range
Dim OutputRow As Long
' 入力シートと出力シートを設定
Set wsInput = ThisWorkbook.Sheets("入力シート")
Set wsOutput = ThisWorkbook.Sheets("出力シート")
Set wsOutput2 = ThisWorkbook.Sheets("出力シート2")
Set wsOutput3 = ThisWorkbook.Sheets("出力シート3")
' 最終行を取得(B列のデータが入力されている最終行を基準にする)
LastRow = wsInput.Cells(wsInput.Rows.Count, "B").End(xlUp).Row
' 列の範囲を設定
Set DateRange = wsInput.Range("B9:B" & LastRow)
Set WeekdayRange = wsInput.Range("C9:C" & LastRow)
Set AbsenceRange = wsInput.Range("E9:E" & LastRow)
Set WorkTypeRange = wsInput.Range("F9:F" & LastRow)
Set DepartureTimeRange = wsInput.Range("I9:I" & LastRow)
' 出力行の初期化
OutputRow = 1
'シート2の出力初期化
Dim OutputRowSheet2 As Long
OutputRowSheet2 = 1
' シート3の出力行初期化
Dim OutputRowSheet3 As Long
OutputRowSheet3 = 1
' 行ごとにデータを検査
Dim i As Long
For i = 1 To LastRow - 8 ' ヘッダー行を除外するために -8 する
If (AbsenceRange.Cells(i).Value = "" And WorkTypeRange.Cells(i).Value = "日勤" And DepartureTimeRange.Cells(i).Value > TimeValue("17:15")) Or _
(AbsenceRange.Cells(i).Value = "" And WorkTypeRange.Cells(i).Value = "6:45早出" And DepartureTimeRange.Cells(i).Value > TimeValue("15:30")) Or _
(AbsenceRange.Cells(i).Value = "" And WorkTypeRange.Cells(i).Value = "11時遅出" And DepartureTimeRange.Cells(i).Value > TimeValue("19:45")) Then
If OutputRow <= 8 Then
' 出力シート1に記載
wsOutput.Cells(OutputRow + 6, 1).Value = DateRange.Cells(i).Value ' 日付
wsOutput.Cells(OutputRow + 6, 2).Value = WeekdayRange.Cells(i).Value ' 曜日
wsOutput.Cells(OutputRow + 6, 5).Value = DepartureTimeRange.Cells(i).Value ' 退勤時刻
Else
If OutputRowSheet2 <= 8 Then
' 出力シート2に記載
wsOutput2.Cells(OutputRowSheet2 + 6, 1).Value = DateRange.Cells(i).Value ' 日付
wsOutput2.Cells(OutputRowSheet2 + 6, 2).Value = WeekdayRange.Cells(i).Value ' 曜日
wsOutput2.Cells(OutputRowSheet2 + 6, 5).Value = DepartureTimeRange.Cells(i).Value ' 退勤時刻
Else
' 出力シート3に記載
wsOutput3.Cells(OutputRowSheet3 + 7, 1).Value = DateRange.Cells(i).Value ' 日付
wsOutput3.Cells(OutputRowSheet3 + 7, 2).Value = WeekdayRange.Cells(i).Value ' 曜日
wsOutput3.Cells(OutputRowSheet3 + 7, 5).Value = DepartureTimeRange.Cells(i).Value ' 退勤時刻
End If
OutputRowSheet2 = OutputRowSheet + 1
End If
' 出力行を増やす
OutputRow = OutputRow + 1
OutputRowSheet2 = OutputRowSheet + 1
End If
Next i
No.3ベストアンサー
- 回答日時:
以下のようにしてください。
Sub 出力するコード()
Dim wsInput As Worksheet
Dim wsOutput As Worksheet
Dim wsOutput2 As Worksheet
Dim wsOutput3 As Worksheet
Dim LastRow As Long
Dim DateRange As Range
Dim WeekdayRange As Range
Dim AbsenceRange As Range
Dim WorkTypeRange As Range
Dim DepartureTimeRange As Range
Dim OutputRow As Long
' 入力シートと出力シートを設定
Set wsInput = ThisWorkbook.Sheets("入力シート")
Set wsOutput = ThisWorkbook.Sheets("出力シート")
Set wsOutput2 = ThisWorkbook.Sheets("出力シート2")
Set wsOutput3 = ThisWorkbook.Sheets("出力シート3")
' 最終行を取得(B列のデータが入力されている最終行を基準にする)
LastRow = wsInput.Cells(wsInput.Rows.Count, "B").End(xlUp).Row
' 列の範囲を設定
Set DateRange = wsInput.Range("B9:B" & LastRow)
Set WeekdayRange = wsInput.Range("C9:C" & LastRow)
Set AbsenceRange = wsInput.Range("E9:E" & LastRow)
Set WorkTypeRange = wsInput.Range("F9:F" & LastRow)
Set DepartureTimeRange = wsInput.Range("I9:I" & LastRow)
' 出力行の初期化
OutputRow = 1
' 行ごとにデータを検査
Dim i As Long
For i = 1 To LastRow - 8 ' ヘッダー行を除外するために -8 する
If (AbsenceRange.Cells(i).Value = "" And WorkTypeRange.Cells(i).Value = "日勤" And DepartureTimeRange.Cells(i).Value > TimeValue("17:15")) Or _
(AbsenceRange.Cells(i).Value = "" And WorkTypeRange.Cells(i).Value = "6:45早出" And DepartureTimeRange.Cells(i).Value > TimeValue("15:30")) Or _
(AbsenceRange.Cells(i).Value = "" And WorkTypeRange.Cells(i).Value = "11時遅出" And DepartureTimeRange.Cells(i).Value > TimeValue("19:45")) Then
Dim sheet_no As Long
Dim row_no As Long
Dim wsout As Worksheet
sheet_no = (OutputRow - 1) \ 8 + 1
row_no = OutputRow Mod 8
If row_no = 0 Then row_no = 8
If sheet_no = 1 Then Set wsout = wsOutput
If sheet_no = 2 Then Set wsout = wsOutput2
If sheet_no = 3 Then Set wsout = wsOutput3
wsout.Cells(row_no + 6, 1).Value = DateRange.Cells(i).Value ' 日付
wsout.Cells(row_no + 6, 2).Value = WeekdayRange.Cells(i).Value ' 曜日
wsout.Cells(row_no + 6, 5).Value = DepartureTimeRange.Cells(i).Value ' 退勤時刻
' 出力行を増やす
OutputRow = OutputRow + 1
End If
Next i
End Sub
No.4
- 回答日時:
まあ、様式が決まっているのだろうとは推測はしていました。
ならば、
For~Next
を使わずに記述してみることを勧めます。
そのうえで、
For~Next
でまとめられる箇所を後からまとめるようにしてみましょう。
繰り返し処理の中で適切に処理が行われていないことが原因ですからね。
繰り返し処理を使わずにコードを書いてみるのです。
無駄に思えるかもしれませんが、意図した動作をしないときは、
確実に動作する形を作ってそこから修正することを勧めます。
様式が決まっているなら垂れ流しのコードでも終端はありますので、普通に作れるはずです。
↑様式が決まっている……が推測だったためこのアドバイスができませんでした。
最初に様式が決まっているとお伝えしていれば良かったですね。。。すみません。
繰り返し処理を行なわない…という発想もあるのですね!
ありがとうございます。
No.2
- 回答日時:
こんばんは
基本的に、No1様の回答に1票です。
>2枚目ではどうもうまく機能していないようです。
直接の原因は、
>OutputRowSheet2 = OutputRowSheet + 1
の右辺の OutputRowSheet という変数がどこにも無いので、多分0と見做されているのではないかと推測します。
どうしても3シートにしたいにしても、同じことを何度も記述するのはあまり効率の良い書き方とは言えません。
記入先を変数にしておけば、そこを入れ替えるだけでシートを変更できることになるので、転記の記述をダブらないようにすることができるでしょう。
意味がわからなければ、
1)一旦、シート1に全部記入してしまい。
2)9~16行をまとめてシート2にカット&ペースト
3)17~24行をまとめてシート3にカット&ペースト
という手順にしておくことで、2)、3)は1センテンスで済むので、ほぼ重複した記述をしなくても済むようになりそうな気がします。
(↑は、シートの他の部分の状態が不明なので、うまくいくのか不明ですけれど・・)
ご回答ありがとうございます。
一旦シート1にまとめ、9行目からシート2に入力していくやりかたで行います。
ありがとうございました。
No.1
- 回答日時:
ごめん。
そもそもの話になります。(´・ω・`) シートを分ける必要ないような気がするんですけど...。
ページ設定で「印刷タイトル行」を決めておけば、あとは下にデータを並べるだけで良いよね。
そして「ページレイアウト」で表示すれば良いんじゃね?
シートを分ける必要はそれでなくなるような気がするのです。
ご回答ありがとうございます。
分ける必要があります。様式が決まっているため時刻データの羅列を単に分割して印刷するわけにはいかないのです。
また、出力する時刻データも毎日分ではなく、残業のあった日のみ抽出してくる必要があるため、条件にあった時刻データを見つけて、様式の上から順に記載し、1枚目が埋まれば2枚目への記述…という形になっています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルマクロでデータ出力の際の条件がうまく機能しません。 2 2023/09/30 13:01
- Excel(エクセル) エクセルマクロでデータ出力の際の条件がうまく機能しません。 5 2023/10/01 12:50
- Visual Basic(VBA) シートごとに 個数と集計 2 2021/10/25 22:00
- Visual Basic(VBA) 条件をつけてカウントする 4 2021/12/19 20:27
- Visual Basic(VBA) 【VBA】ユーザーフォーム リストボックスのヘッダー設定方法 2 2021/12/02 11:15
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
- Visual Basic(VBA) 空のシートに関数を入れたい 2 2021/12/03 15:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
マクロVBAについてご教授いただけましたらと存じます。
Visual Basic(VBA)
-
エクセル2016でfilter関数がないので、、抜き出す関数をおしえてください。
Excel(エクセル)
-
2013Excel保存済みファイルグレーアウト Excelを開こうとするとメニュー以外全てグレーにな
Excel(エクセル)
-
-
4
指定した範囲から、文字A、文字Bの数をそれぞれカウントする数式が知りたいです。よろしくお願いします。
Excel(エクセル)
-
5
エクセルで リンクが切れない状態で文字を入れたい
Excel(エクセル)
-
6
Excelの転記マクロについて、教えて下さい excelのマクロでまた悩んでいます! AAAAという
Excel(エクセル)
-
7
Excelでオートフィルをした時に,値のバグについて
Excel(エクセル)
-
8
【VBA】飛び飛びの3セルに完了"かもしくは"支援なし"の文字が入っていたら、計算を実行したい"
Visual Basic(VBA)
-
9
select case について
Visual Basic(VBA)
-
10
エクセル VBA 他シートの行を選択して,転記する。
Visual Basic(VBA)
-
11
【補足欄が足りなかったため、こちらで再質問させていただきます。】 Excelの転記マクロについて、教
Visual Basic(VBA)
-
12
エクセル 関数
Excel(エクセル)
-
13
エクセル→貼り付けのオプション→貼り付け先の書式に合わせる が急にできなくなった。 どうして?
Excel(エクセル)
-
14
一つのフォルダーに50個のエクセルファイルがあります。 各ファイルにはAとBのシートがあります。 5
Visual Basic(VBA)
-
15
Excel VBAにて、2GB超の点群データ(CSVファイル,改行コードLF)を高速で解析したい。
Visual Basic(VBA)
-
16
csvファイルを列数ごとに分割するExcelマクロが書けずに困っています
Visual Basic(VBA)
-
17
Windows 11 Pro での、VBAのCode書き換えで、1点お教え願います。
Visual Basic(VBA)
-
18
Excelについて質問です。 タブキーを押すと編集しているセルが右隣に移りますが、私はタブキーを押し
Excel(エクセル)
-
19
エクセル 条件付き書式設定
Excel(エクセル)
-
20
ユーザーフォームに別シートからデータを反映させたい。
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
MMDでavi出力が出来ない
-
4Kの外部モニターに出力すると...
-
printfとputcharの違いは
-
cout と cerrの違い
-
printfの書式%.*s
-
OBS配信すると、マイクが途切れ...
-
ACCESS クエリ→フォーム...
-
LEDの光出力って?
-
無線とかアンテナに関しの質問...
-
VBAでテキスト出力時のスペース...
-
プログラムについての質問です...
-
アクセスでエクセルに出力する...
-
発電機の出力について
-
デスクトップPCでWQHD出力させたい
-
makeで文字化けする。migwのmak...
-
VBA レジストリの値の読み方に...
-
Verilogでalways文で意図しない...
-
C言語のプログラミング【文字列】
-
充電器の表記についての質問で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
MMDでavi出力が出来ない
-
プログラムについての質問です...
-
コンセントの電力は入力と出力...
-
AIに回答させるって
-
OBS配信すると、マイクが途切れ...
-
VBAでテキスト出力時のスペース...
-
cout と cerrの違い
-
アクセスでエクセルに出力する...
-
printfとputcharの違いは
-
ACCESS クエリ→フォーム...
-
VBAのExecメソッドで画面を非表...
-
テキストファイルから特定の文...
-
COBOLのMOVEで桁数が異なる場合
-
VBAで有効数字の設定
-
coutで出力した文字を消去する...
-
Windows Formアプリからコンソ...
-
KEYENCEのシーケンスプログラム...
-
CRC16計算について
おすすめ情報