VBA初心者です。
・Before
A B C D E
「日付」「No」「開始時間」「終了時間」「金額」と
縦に並んでいるデータを「日付」を1番、「No」を2番の基準で別シートへ1列に並べ替えたいです。
・After
A B C D E F G H
「日付」「No」「開始時間」「終了時間」「金額」「開始時間」「終了時間」「金額」
お店のレシートのデータがBeforeのように出てきます。
その後、ガントチャートにするので、Afterの形にしたいです。
日付やNoはその日によって違います。
恐れ入りますが、ご教示をよろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
No.3 訂正です
※ ソート前に「日付」は時間部分をカット「No」は端数をカットした方が間違いないので以下に差替えてみて下さい。
※ まだ同じ「日付」「No」で行が別れてしまうのならば、AとB列だけ見えれば良いのでそこだけを図で提示して下さい。(図の大きさですが長辺が500ピクセルを超えると勝手に縮小されるので、なるべくそれに収まるようにトリミングして下さい)
Sub Sample()
Dim 元行 As Long
Dim 先行 As Long
Dim 先列 As Long
Dim 終行 As Long
Dim 日付 As Date
Dim ワークシート As Worksheet
For Each ワークシート In Worksheets
If ワークシート.Name = "ガントチャートデータ" Then
Application.DisplayAlerts = False
Sheets("ガントチャートデータ").Delete
Application.DisplayAlerts = True
Exit For
End If
Next
Sheets("稼働表データ").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "ガントチャートデータ"
終行 = Cells(Rows.Count, 1).End(xlUp).Row
For 元行 = 1 To 終行
Cells(元行, 1).Value = Int(Cells(元行, 1).Value)
Cells(元行, 2).Value = Int(Cells(元行, 2).Value)
Next
Cells.Sort _
Key1:=Range("A1"), Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending, _
Key3:=Range("C1"), Order3:=xlAscending, _
Header:=xlNo
終行 = Cells(Rows.Count, 1).End(xlUp).Row
先行 = 1
先列 = 3
For 元行 = 2 To 終行
If (Cells(元行 - 1, 1).Value) = Int(Cells(元行, 1).Value) And (Cells(元行 - 1, 2).Value) = Int(Cells(元行, 2).Value) Then
先列 = 先列 + 3
Range(Cells(元行, 3), Cells(元行, 5)).Cut Cells(先行, 先列)
Else
先行 = 先行 + 1
先列 = 3
Range(Cells(元行, 1), Cells(元行, 5)).Copy Cells(先行, 1)
End If
Next
Range(Cells(先行 + 1, 1), Cells(終行, 5)).ClearContents
終行 = ActiveSheet.UsedRange.Row
終行 = Cells(Rows.Count, 1).End(xlUp).Row
日付 = Cells(1, 1).Value
For 元行 = 2 To 終行
If 日付 = Cells(元行, 1).Value Then
Cells(元行, 1).ClearContents
Else
日付 = Cells(元行, 1).Value
End If
Next
MsgBox ("終了しました")
End Sub
GooUserラック様
ありがとうございます。思っていた通りのデータになりました。
大変助かります。
また何かございましたら是非ともお願いいたします。
No.3
- 回答日時:
とりあえず以下でお試しください。
※ 比較前に「日付」は時間部分をカット「No」は端数をカットしてます
Sub Sample()
Dim 元行 As Long
Dim 先行 As Long
Dim 先列 As Long
Dim 終行 As Long
Dim 日付 As Date
Dim ワークシート As Worksheet
For Each ワークシート In Worksheets
If ワークシート.Name = "ガントチャートデータ" Then
Application.DisplayAlerts = False
Sheets("ガントチャートデータ").Delete
Application.DisplayAlerts = True
Exit For
End If
Next
Sheets("稼働表データ").Copy After:=Sheets(Sheets.Count)
ActiveSheet.Name = "ガントチャートデータ"
Cells.Sort _
Key1:=Range("A1"), Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending, _
Key3:=Range("C1"), Order3:=xlAscending, _
Header:=xlNo
終行 = Cells(Rows.Count, 1).End(xlUp).Row
For 元行 = 1 To 終行
Cells(元行, 1).Value = Int(Cells(元行, 1).Value)
Cells(元行, 2).Value = Int(Cells(元行, 2).Value)
Next
先行 = 1
先列 = 3
For 元行 = 2 To 終行
If (Cells(元行 - 1, 1).Value) = Int(Cells(元行, 1).Value) And (Cells(元行 - 1, 2).Value) = Int(Cells(元行, 2).Value) Then
先列 = 先列 + 3
Range(Cells(元行, 3), Cells(元行, 5)).Cut Cells(先行, 先列)
Else
先行 = 先行 + 1
先列 = 3
Range(Cells(元行, 1), Cells(元行, 5)).Copy Cells(先行, 1)
End If
Next
Range(Cells(先行 + 1, 1), Cells(終行, 5)).ClearContents
終行 = ActiveSheet.UsedRange.Row
終行 = Cells(Rows.Count, 1).End(xlUp).Row
日付 = Cells(1, 1).Value
For 元行 = 2 To 終行
If 日付 = Cells(元行, 1).Value Then
Cells(元行, 1).ClearContents
Else
日付 = Cells(元行, 1).Value
End If
Next
MsgBox ("終了しました")
End Sub
No.2
- 回答日時:
☆「別シートへ」と書かれていなかったので、上書きする形で作成しました。
⇒ 了解しました後ほど修正します。元のシート名と貼り付け先のシート名を教えて下さい。
☆ 同じ「日付」の物は最初以外は空欄にした方が良いのですね?
⇒ 了解しました後ほど修正します。
☆ 同じ「日付」「No」で行が別れてしまってますね?それぞれの数式バーの値を見て以下を確認して下さい。
・「日付」に時間が含まれていたりしませんか?
・「No」に端数が有るが表示形式で同じに見えている等ありませんか?
No.1
- 回答日時:
こんな事でしょうか?
Sub Sample()
Dim 元行 As Long
Dim 先行 As Long
Dim 先列 As Long
Dim 終行 As Long
Cells.Sort _
Key1:=Range("A1"), Order1:=xlAscending, _
Key2:=Range("B1"), Order2:=xlAscending, _
Key3:=Range("C1"), Order3:=xlAscending, _
Header:=xlNo
先行 = 1
先列 = 3
終行 = Cells(Rows.Count, 1).End(xlUp).Row
For 元行 = 2 To 終行
If (Cells(元行 - 1, 1).Value = Cells(元行, 1).Value) And (Cells(元行 - 1, 2).Value = Cells(元行, 2).Value) Then
先列 = 先列 + 3
Range(Cells(元行, 3), Cells(元行, 5)).Cut Cells(先行, 先列)
Else
先行 = 先行 + 1
先列 = 3
Range(Cells(元行, 1), Cells(元行, 5)).Copy Cells(先行, 1)
End If
Next
Range(Cells(先行 + 1, 1), Cells(終行, 5)).ClearContents
終行 = ActiveSheet.UsedRange.Row
MsgBox ("終了しました")
End Sub
※「終行 = ActiveSheet.UsedRange.Row」はスクロールバーなどに使用範囲を反映させる処理、終行はただのダミーです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 指定した値以上の中で最小値を出したい 7 2022/10/24 21:12
- Excel(エクセル) セルに特定の色が出た時だけ、式を発動させたい 4 2022/06/17 10:32
- その他(Microsoft Office) エクセル 条件付き書式 日をまたぐ塗りつぶし 1 2023/01/13 18:00
- その他(プログラミング・Web制作) GASでガントチャートを作りたいです 1 2022/09/05 17:26
- Visual Basic(VBA) マクロで設定時刻の入力がわかりません 2 2022/03/29 02:24
- アルバイト・パート 初めてバイトを始めました。まだ初めてから1ヶ月程ですが、少し違和感がします。 その職場はタイムカード 1 2022/05/07 01:57
- その他(Microsoft Office) 【スプレッドシート】最初の契約日と最後の契約期間を抽出したい 添付のように派遣先、スタッフ、契約開始 2 2023/03/13 21:18
- 避妊 至急教えてください。アフターピルを飲むべきですか? 低容量ピルを服用していますが、アフターピルを飲ん 3 2023/05/02 11:09
- Excel(エクセル) エクセル「社員の重なっている仕事時間の算出方法について」教えてください。 6 2023/02/06 00:10
- Excel(エクセル) Excel2007での条件付き書式について 6 2023/05/02 10:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
お肉の下のシートを煮込んでし...
-
条件にマッチする行を抽出するV...
-
毎日の日計を別シートに自動で...
-
チュロス袋の代用
-
エクセルのシートをコピーして...
-
エクセルを利用して、日計と累...
-
2つのシート間での重複データ...
-
エクセルでフラグがたっている...
-
Excelで複数のシートに列のグル...
-
複数シートの列、幅の一括変更方法
-
EOMONTH関数の代わり
-
日付順で縦に並んでいるデータ...
-
CSV形式で名前を付けて保存 マ...
-
エクセルで○のついた項目を抽出
-
EXCELで受験票を作成したい(名...
-
指定した条件でTRANSPOSE関数を...
-
エクセルの複数のセルを一括で...
-
参照先セルに値が入っていない...
-
EXCELで○ヶ月を○年○ヶ月に変換...
-
複数の文字列のいずれかが含ま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
お肉の下のシートを煮込んでし...
-
エクセルを利用して、日計と累...
-
毎日の日計を別シートに自動で...
-
2つのシート間での重複データ...
-
エクセルのシートをコピーして...
-
指定した条件でTRANSPOSE関数を...
-
エクセルで○のついた項目を抽出
-
条件にマッチする行を抽出するV...
-
excel シート1の奇数(偶数)...
-
エクセルで1行だけ数式が反映さ...
-
EOMONTH関数の代わり
-
チュロス袋の代用
-
エクセルで2つのシートに同じ名...
-
エクセルでフラグがたっている...
-
EXCELで受験票を作成したい(名...
-
excelマクロで複数シート間のデ...
-
エクセル ○印がついている行を...
-
VBA 縦のデータを横にするコード
-
Excelで複数のシートに列のグル...
-
Excel VBA 12ヶ月分のシート作成
おすすめ情報
GooUserラック様 ご連絡ありがとうございます。早速試してみましたところ、添付いたしました画像のようになりました。
別シートへNo順に1行で表したいのですが、私の設定方法が間違えているようでしたらご教示お願い致します。
GooUserラック様 何回もお手数をお掛けいたしまして申し訳ございません。
・元シート名「稼働表データ」、貼り付け先シート名「ガントチャートデータ」でお願い致します。
・日付には時間は含まれておりません。
・「No」に端数は含まれておりません。
よろしくお願い致します。