エクセルマクロで残業時間入力シートを作成しています。
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)
-
[Excel] 以下のような、行がズレている2つの表を関数を使って同値チェックを行いたいです。 欲し
Excel(エクセル)
-
IF関数でFALSEが表示されないようにするにはどうしたらいいですか?
Excel(エクセル)
-
-
4
エクセルおいて,論理式の関数を使う場合は,空白のセルは,数字では0と扱われますか?
Excel(エクセル)
-
5
Excelでスクロールすると文字が消える現象について
Excel(エクセル)
-
6
【VBA】エクセルで値のみクリップボードにコピーするコードについて(貼り付け時の空白削除)
Visual Basic(VBA)
-
7
入力した文字を全て自動で全角にしてくれるコード
Visual Basic(VBA)
-
8
エクセルのIF関数について
Excel(エクセル)
-
9
Excel:文字との間に数字の組合せ、次のセルの数字を1ずつ増やすには?
Excel(エクセル)
-
10
エクセル2016でfilter関数がないので、、抜き出す関数をおしえてください。
Excel(エクセル)
-
11
ExcelのVBAで同一フォルダ内にあるファイルに同じ処理をしたい
Excel(エクセル)
-
12
複雑なシフト表から1日ごとの出勤者、シフトを抜き出したいです
Excel(エクセル)
-
13
2013Excel保存済みファイルグレーアウト Excelを開こうとするとメニュー以外全てグレーにな
Excel(エクセル)
-
14
エクセルで リンクが切れない状態で文字を入れたい
Excel(エクセル)
-
15
Excelでオートフィルをした時に,値のバグについて
Excel(エクセル)
-
16
指定した範囲から、文字A、文字Bの数をそれぞれカウントする数式が知りたいです。よろしくお願いします。
Excel(エクセル)
-
17
Excelの転記マクロについて、教えて下さい excelのマクロでまた悩んでいます! AAAAという
Excel(エクセル)
-
18
エクセル VBA 他シートの行を選択して,転記する。
Visual Basic(VBA)
-
19
エクセル→貼り付けのオプション→貼り付け先の書式に合わせる が急にできなくなった。 どうして?
Excel(エクセル)
-
20
Excelについて質問です。 タブキーを押すと編集しているセルが右隣に移りますが、私はタブキーを押し
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
AIに回答させるって
-
KEYENCEのシーケンスプログラム...
-
cout と cerrの違い
-
プログラムについての質問です...
-
printfとputcharの違いは
-
VBAのExecメソッドで画面を非表...
-
ListViewの複数選択について
-
バッチファイル フォルダサイ...
-
printfの書式%.*s
-
C# 標準出力のencodingをutf8に...
-
Windows Formアプリからコンソ...
-
ブランキング期間
-
AviUtl 出力の失敗
-
汎用人型決戦兵器「人造人間エ...
-
ACCESS クエリ→フォーム...
-
標準出力の上書き
-
C言語の標準関数の引数の順番に...
-
CRC16計算について
-
最近の画像生成AIについて。 長...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
OBS配信すると、マイクが途切れ...
-
VBAでテキスト出力時のスペース...
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
ACCESS クエリ→フォーム...
-
アクセスでエクセルに出力する...
-
VBAのExecメソッドで画面を非表...
-
テキストファイルから特定の文...
-
Windows11対応の3入力1出力 USB...
-
VBAで有効数字の設定
-
スマホのバッテリー消費につい...
-
Excel VBAで値を変えながら、pd...
-
NTTのホームゲートウェイとOCN...
-
定格冷房能力(出力)とは 定格...
-
プログラムについての質問です...
-
PS5をMacBookProに出力したいの...
おすすめ情報