- ベストアンサー
エクセルVBAでOFFSET指定で行増減する時追従
- エクセルVBAを使って行の増減を追従させる方法を教えてください。
- 日付セルを選択し、VBAを実行して各作業者の内容をコピー・貼り付けする際、行を増やしたり減らしたりしても追従する方法を知りたいです。
- 作業者Aの行の数が変動しても、作業者Bの位置がずれることなく、各作業者の内容を正しくコピー・貼り付けする方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
準備: 4行から17行までの「行範囲」にまとめて「作業者A」と名前を定義する。 手順: application.intersect(activecell.mergearea.entirecolumn, range("作業者A")).copy のようにして範囲を指定する。 >行を増やしたり減らしたりしてもうまく追従してくれるやり方が何かいい方法 行を増やした減らしたと「言葉で言ってる」だけじゃなく、具体的にいま対象の範囲がどこからどこまでなのか、あなたのエクセルで「いま調べる方法」を考えて次からもっと工夫してください。 たとえばA列がこれこれになってる範囲が作業者一人分の範囲だとか。 たとえば3行目が日付でセル結合されているとして、次に同じようにセル結合されてる18行目や19行目までの範囲がヒトカタマリになるとか。
その他の回答 (3)
- kkkkkm
- ベストアンサー率66% (1742/2617)
No2のまた訂正と補足です。 訂正 もし質問のように作業者Aと作業者Bの行数が同じになるのでしたらbは求めなくてよくて ↓ もし質問のように作業者Aと作業者Bの行数が同じになるのでしたらbは一度だけ求めればよくて あと補足として もとがCopyを使っていたので ActiveCell.Offset(1, 0).Resize(BottomRow - FastRow, 7).Copy Sheets("Sheet2").Cells(FastRow, "C").PasteSpecial にしましたが、以下のほうが比較にならないくらい早いです。 Sheets("Sheet2").Cells(FastRow, "C").Resize(BottomRow - FastRow + 1, 7).Value = ActiveCell.Offset(1, 0).Resize(BottomRow - FastRow + 1, 7).Value なお、ActiveCellを利用しているので実行時に本来のセルを選択してるかどうかのチェックは一番最初にしておかないととんでもないことになります。
お礼
どうもありがとうございました。 アクティブセルの位置チェックは最初に行うようにしています。 参考になりました。
- kkkkkm
- ベストアンサー率66% (1742/2617)
No2です。訂正です。 ActiveCell.Offset(1, 0).Resize(BottomRow - FastRow, 7).Copy ↓ ActiveCell.Offset(1, 0).Resize(BottomRow - FastRow + 1, 7).Copy
お礼
どうもありがとうございました。
- kkkkkm
- ベストアンサー率66% (1742/2617)
> C3:I3を月曜とすると、その下のC4:I17に作業者Aの月曜日分の内容、 > C19:I32が作業者Bの火曜日分の内容となっています。 上は作業者Aの月曜日分で下は作業者Bの火曜日分ですか?この辺がよくわかりませんが、とりあえず作業者Aと作業者Bの間にだけ空白(何もデータが入ってない)の行があるとして考えてみました。で、空白の行を探すということで、ActiveCellを移動しながら ActiveCell.Offset(1, 0).Resize(b, 7).COPY で、bを求めればいいわけですよね。もし質問のように作業者Aと作業者Bの行数が同じになるのでしたらbは求めなくてよくてActiveCellを移動だけすればいいことになります。 とりあえず、空白の行を探しActiveCellを移動しbを求めるということで速度は遅いですが、参考までに Sub Example() Dim i As Long, TopRow As Long, BottomRow As Long, FastRow As Long, LastRow As Long Dim m_Column As Long Application.ScreenUpdating = False FastRow = ActiveCell.Offset(1, 0).Row LastRow = ActiveCell.SpecialCells(xlLastCell).Row m_Column = ActiveCell.Column For i = 1 To 2 Call CopyPaste(FastRow, LastRow, m_Column) Next i Application.ScreenUpdating = True Application.CutCopyMode = False End Sub Private Sub CopyPaste(ByRef FastRow As Long, ByRef LastRow As Long, ByVal m_Column As Long) Dim i As Long, BottomRow As Long BottomRow = LastRow For i = FastRow To LastRow If Cells(i, m_Column) = "" Then BottomRow = i Exit For End If Next i ActiveCell.Offset(1, 0).Resize(BottomRow - FastRow, 7).Copy Sheets("Sheet2").Cells(FastRow, "C").PasteSpecial '貼り付け先は不明なのでとりあえすSheet2にしています。 Cells(BottomRow, m_Column).Activate FastRow = BottomRow + 1 End Sub
お礼
どうもありがとうございました。
補足
> C3:I3を月曜とすると、その下のC4:I17に作業者Aの月曜日分の内容、 > C19:I32が作業者Bの火曜日分の内容となっています。 火曜→月曜の間違いでした。火曜日分はJ:P列でした。 試してみました。空白行を探すのですが、このやり方だと内容を隙間を開けて入力していると必要な所まで取得できませんでした。 NO1さんのやり方を試したところうまくできました。 でも参考になりました。どうもありがとうございました。
お礼
思い通りになりました。 どうもありがとうございました。