将Excel行分成单独的工作表并保留页眉 [英] Separate Excel rows into individual sheets and retain header

查看:53
本文介绍了将Excel行分成单独的工作表并保留页眉的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在Excel中使用VBA将行分成单独的工作表并保留标题.以下是我到目前为止的内容.它起作用,除了我得到标题行,然后我要移到工作表的单个行在那里,但是在那里三遍而不是一遍.我基本上是经过反复试验而感到困惑.请帮助!我对此没有经验:

I am trying to use VBA in Excel to separate rows into separate sheets and retain headers. Below is what I have so far. It works except I get the header row, then the individual row I want to move to the sheet is there BUT it's there three times instead of one. I am basically going by trial and error and I am stumped. Help please! I have no experience with this:

Sub DispatchTimeSeriesToSheets()
Dim ws As Worksheet
Set ws = Sheets("Scoring")
Dim LastRow As Long

LastRow = Range("A" & ws.Rows.Count).End(xlUp).Row

' stop processing if we don't have any data
If LastRow < 2 Then Exit Sub

Application.ScreenUpdating = False
SortScoring LastRow, ws
CopyDataToSheets LastRow, ws
ws.Select
Application.ScreenUpdating = True
End Sub

Sub SortScoring(LastRow As Long, ws As Worksheet)
ws.Range("A4:W" & LastRow).Sort Key1:=ws.Range("A4"), Key2:=ws.Range("W4")
End Sub

Sub CopyDataToSheets(LastRow As Long, src As Worksheet)
Dim rng As Range
Dim cell As Range
Dim Series As String
Dim SeriesStart As Long
Dim SeriesLast As Long

Set rng = Range("A4:A" & LastRow)
SeriesStart = 2
Series = Range("A" & SeriesStart).Value
For Each cell In rng
    If cell.Value <> Series Then
        SeriesLast = cell.Row - 1
        CopySeriesToNewSheet src, SeriesStart, SeriesLast, Series
        Series = cell.Value
        SeriesStart = cell.Row
    End If
Next
' copy the last series
SeriesLast = LastRow
CopySeriesToNewSheet src, SeriesStart, SeriesLast, Series

End Sub

Sub CopySeriesToNewSheet(src As Worksheet, Start As Long, Last As Long, _
                                                    name As String)
Dim tgt As Worksheet

If (SheetExists(name)) Then
    MsgBox "Sheet " & name & " already exists. " _
    & "Please delete or move existing sheets before" _
    & " copying data from the Scoring.", vbCritical, _
    "Time Series Parser"
    End
End If

Worksheets.Add(After:=Worksheets(Worksheets.Count)).name = name
Set tgt = Sheets(name)

' copy header row from src to tgt
tgt.Range("A1:W1").Value = src.Range("A1:W1").Value

' copy data from src to tgt
tgt.Range("A4:W" & Last - Start + 2).Value = _
    src.Range("A" & Start & ":W" & Last).Value
End Sub

Function SheetExists(name As String) As Boolean
Dim ws As Worksheet

SheetExists = True
On Error Resume Next
Set ws = Sheets(name)
If ws Is Nothing Then
   SheetExists = False
End If
End Function

推荐答案

这将满足您的需求

Const HeaderRow = 3
Sub MoveRecordsByValues()
Dim ws As Worksheet
Dim dws As Worksheet
Dim SheetName As String

Application.DisplayAlerts = False
For Each ws In Sheets
If ws.name <> "Scoring" Then ws.Delete
Next ws
Set ws = Sheets("Scoring")
StartRow = HeaderRow + 1
LastRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row

For RowCounter = StartRow To LastRow
    SheetName = ws.Cells(RowCounter, 1)
    If Not SheetExists(SheetName) Then SetUpSheet SheetName, ws, HeaderRow
    Set dws = Worksheets(SheetName)
    DestLastRow = dws.Range("A" & dws.Rows.Count).End(xlUp).Row + 1
    ws.Rows(RowCounter).Copy dws.Cells(DestLastRow, 1)
Next RowCounter
Application.DisplayAlerts = True
End Sub

Function SheetExists(name As String) As Boolean
    SheetExists = True
    On Error GoTo errorhandler
    Sheets(name).Activate
    Exit Function
errorhandler:
    SheetExists = False
End Function

Sub SetUpSheet(name, SourceSheet, HeaderRow)
    Dim DestSheet As Worksheet
    Set DestSheet = Sheets.Add
    DestSheet.name = name
    SourceSheet.Rows(1).Copy DestSheet.Cells(1, 1)
    SourceSheet.Rows(2).Copy DestSheet.Cells(2, 1)
    SourceSheet.Rows(3).Copy DestSheet.Cells(3, 1)
End Sub

这篇关于将Excel行分成单独的工作表并保留页眉的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆