Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用VBA将Excel中的单列转换为多个不均匀的列/行_Excel_Vba_Copy Paste - Fatal编程技术网

如何使用VBA将Excel中的单列转换为多个不均匀的列/行

如何使用VBA将Excel中的单列转换为多个不均匀的列/行,excel,vba,copy-paste,Excel,Vba,Copy Paste,我有不同的测试日期和时间,每个时间点最多可以进行100次测试。我收到的数据只是一列,由数千行组成,应该在矩阵类型的网格中传递 我只复制了一个样本,它有6个时间点,每个时间点最多有4个测试。当单元格中只有日期/时间时,我需要Excel“识别”,然后将该单元格复制到下一个日期/时间以粘贴到新的工作表和列中 最后,我还希望把考试的题目和结果分开。但是,如果在不知道每个测试的名称的情况下这是不合理的,我可以跳过它。这是我开始使用的数据: Title 01/02/2010 0:03 Ounces: 10

我有不同的测试日期和时间,每个时间点最多可以进行100次测试。我收到的数据只是一列,由数千行组成,应该在矩阵类型的网格中传递

我只复制了一个样本,它有6个时间点,每个时间点最多有4个测试。当单元格中只有日期/时间时,我需要Excel“识别”,然后将该单元格复制到下一个日期/时间以粘贴到新的工作表和列中

最后,我还希望把考试的题目和结果分开。但是,如果在不知道每个测试的名称的情况下这是不合理的,我可以跳过它。这是我开始使用的数据:

Title

01/02/2010 0:03
Ounces: 10.87
Concentration: 6.89 (L)
Expiration Date: 11/2/2019  5:47:00

01/06/2011 2:06
Ounces: 18.09
Concentration: 10.7 (H)
Expiration Date: 11/2/2019  5:47:00
Other: Resampled

01/06/2011 2:06
Ounces: 12.87
Concentration: 10.9 (H)
Expiration Date: 11/2/2019  5:47:00
Other: 2nd Sample

09/15/2012 7:07
Ounces: 8.53
Concentration: 9.72
Expiration Date: 12/5/2019  4:45:00

05/02/2013 15:52
Ounces: 11.62
Concentration: 8.42

05/09/2017 1:45
Ounces: 9.34
Concentration: 8.98
我创建了下面的Excel VBA,但在编程方面还是新手,尤其是循环中的循环,因此我不知道如何创建足够动态的偏移量,以便选择正确的单元格,而是将它们复制到新列。我在代码中也有冗余

Sub Transpose()

    Dim dDate As Date
    Dim NumberofTasks As Long
    Dim x As Long

    sSheet = ActiveSheet.Name
    Sheets.Add
    dSheet = ActiveSheet.Name

    With Worksheets("Sheet1")
        ' All Data is in Column A
        NumberofTasks = .Cells(.Rows.Count, "A").End(xlUp).Row

        For x = 1 To NumberofTasks
            Sheets(sSheet).Activate
            If IsDate(.Range("A" & x).Value) Then '<-- check if current cell at Column A is Date
                Range(Cells(x, 1), Cells(x, 1).Offset(4, 0)).Select
                Selection.Copy
                Sheets(dSheet).Activate
                Selection.PasteSpecial Paste:=xlAll, Operation:=xlNone, SkipBlanks:=False _
                , Transpose:=True
                ActiveCell.Offset(1, 0).Select
            End If
        Next x

    End With

End Sub
子转置()
日期
模糊的任务数和长的任务数一样
暗x等长
sSheet=ActiveSheet.Name
表。添加
dSheet=ActiveSheet.Name
带工作表(“表1”)
'所有数据都在A列中
NumberofTasks=.Cells(.Rows.Count,“A”).End(xlUp).Row
对于x=1到NumberofTasks
工作表(sSheet)。激活

如果是IsDate(.Range(“A”&x).Value),则“可以尝试类似的方法。修改并组织原始代码以完成预期任务。如果测试结果的其他参数没有按所示顺序组织,参数之间没有空行,测试结果和/或缺少参数之间没有空行,则需要注意。它只考虑在两个测试标题行(日期时间)之间找到的参数。处理超过1K行的200个测试结果只需0.5秒

Option Explicit
Sub Transpose()
Dim dDate As Date
Dim NumberofTasks As Long
Dim x As Long, LastRow As Long, Xval As Variant
Dim srcWs As Worksheet, trgWs As Worksheet
Dim tm As Double
tm = Timer
Set srcWs = ThisWorkbook.ActiveSheet
Set trgWs = ThisWorkbook.Worksheets.Add
trgWs.Cells(1, 1).Value = "Title"
trgWs.Cells(2, 1).Value = "Ounces:"
trgWs.Cells(3, 1).Value = "Concentration:"
trgWs.Cells(4, 1).Value = "Expiration Date:"
trgWs.Cells(5, 1).Value = "Other:"

With srcWs
    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
    NumberofTasks = 0
    x = 1
    Do While x <= LastRow
    Xval = .Cells(x, 1).Value
        If IsDate(Xval) Then
        NumberofTasks = NumberofTasks + 1
        trgWs.Cells(1, NumberofTasks + 1).Value = .Range("A" & x).Value
        ElseIf VarType(Xval) = vbString And NumberofTasks > 0 Then
        Xval = Trim(LCase(Xval))
           If InStr(1, Xval, "ounces:") > 0 Then
           trgWs.Cells(2, NumberofTasks + 1).Value = Trim(Replace(Xval, "ounces:", ""))
           ElseIf InStr(1, Xval, "concentration:") > 0 Then
           trgWs.Cells(3, NumberofTasks + 1).Value = Trim(Replace(Xval, "concentration:", ""))
           ElseIf InStr(1, Xval, "expiration date:")  > 0 Then
           trgWs.Cells(4, NumberofTasks + 1).Value = Trim(Replace(Xval, "expiration date:", ""))
           ElseIf InStr(1, Xval, "other:")  > 0 Then
           trgWs.Cells(5, NumberofTasks + 1).Value = Trim(Replace(Xval, "other:", ""))
           End If
        End If
    x = x + 1
    Loop
End With
'Debug.Print "Seconds "; Timer - tm
End Sub
选项显式
子转置()
日期
模糊的任务数和长的任务数一样
尺寸x为长,最后一行为长,Xval为变型
将srcWs标注为工作表,将trgWs标注为工作表
双色调暗tm
tm=计时器
设置srcWs=thiswoolk.ActiveSheet
设置trgWs=thiswoolk.Worksheets.Add
trgWs.Cells(1,1).Value=“Title”
trgWs.Cells(2,1).Value=“盎司:”
trgWs.Cells(3,1).Value=“浓度:”
trgWs.Cells(4,1).Value=“到期日期:”
trgWs.Cells(5,1).Value=“其他:”
带SRCW
LastRow=.Cells(.Rows.Count,“A”).End(xlUp).Row
NumberofTasks=0
x=1
那么就做x 0
Xval=修剪(LCase(Xval))
如果InStr(1,Xval,“盎司:”)>0,则
trgWs.Cells(2,NumberofTasks+1).Value=Trim(替换(Xval,盎司:,))
ElseIf InStr(1,Xval,“浓度:”)>0
trgWs.Cells(3,NumberofTasks+1).Value=Trim(替换(Xval,“浓度:,”))
ElseIf InStr(1,Xval,“到期日:”)>0
trgWs.Cells(4,NumberofTasks+1).Value=Trim(替换(Xval,“过期日期:,”))
ElseIf InStr(1,Xval,“其他:”)>0
trgWs.Cells(5,NumberofTasks+1).Value=Trim(替换(Xval,“其他:”,“”)
如果结束
如果结束
x=x+1
环
以
'Debug.Print“秒”;定时器-tm
端接头
测试以产生如下结果
我认为这里是使用
范围进行搜索的更好方法。查找

  • 假设数据在
    Sheet1的第1列
    A列
  • 在演示中,过期日期不正确,我已经在代码中更正了这一点
尝试以下代码:

Sub TP()

Dim wk As Worksheet: Set wk = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long: lr = wk.Cells(wk.Rows.Count, "A").End(xlUp).row

Dim rng As Range
Dim i As Long
Dim j As Long
j = 4
For i = 3 To lr

    Set rng = wk.Range(Cells(i, 1), Cells(i, 1).End(xlDown))
        wk.Cells(2, j).Value = rng.Cells(1, 1).Value

    Set fnd = rng.Find("Ounces")
        If Not fnd Is Nothing Then wk.Cells(3, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Concentration")
        If Not fnd Is Nothing Then wk.Cells(4, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Expiration")
        If Not fnd Is Nothing Then wk.Cells(5, j).Value = Right(fnd.Value, Len(fnd.Value) - Len(Split(fnd.Value, ":")(0)) - 2)
        Set fnd = Nothing
    Set fnd = rng.Find("Other")
        If Not fnd Is Nothing Then wk.Cells(6, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing

    i = Cells(i, 1).End(xlDown).row + 1
    j = j + 1
Next

End Sub
Option Explicit

Sub Sample()
    Dim InputArray As Variant
    Dim ws As Worksheet
    Dim i As Long
    Dim recCount As Long
    Dim lRow As Long
    Dim OutputArray() As String

    '~~> Set relevant input sheet
    Set ws = Sheet1

    With ws
        '~~> Find Last Row in Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Store col A in array
        InputArray = .Range("A1:A" & lRow).Value

        '~~> Find Total number of records
        For i = LBound(InputArray) To UBound(InputArray)
            If IsDate(InputArray(i, 1)) Then recCount = recCount + 1
        Next i

        '~~> Create an array for output
        ReDim OutputArray(1 To 5, 1 To recCount + 1)

        recCount = 2

        '~~> Fill Col A of output array
        OutputArray(1, 1) = "Title"
        OutputArray(2, 1) = "Ounces"
        OutputArray(3, 1) = "Concentration"
        OutputArray(4, 1) = "Expiration Date"
        OutputArray(5, 1) = "Other"

        '~~> Loop through input array
        For i = UBound(InputArray) To LBound(InputArray) Step -1
            If IsDate(InputArray(i, 1)) Then '< Check if date
                OutputArray(1, recCount) = InputArray(i, 1)

                '~~> Check for Ounces and store in array
                If i + 1 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 1, 1)), 2)) = "OU" _
                Then OutputArray(2, recCount) = Trim(Replace(InputArray(i + 1, 1), "Ounces:", ""))

                '~~> Check for Concentration and store in array
                If i + 2 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 2, 1)), 2)) = "CO" _
                Then OutputArray(3, recCount) = Trim(Replace(InputArray(i + 2, 1), "Concentration:", ""))

                '~~> Check for Expiration Date and store in array
                If i + 3 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 3, 1)), 2)) = "EX" _
                Then OutputArray(4, recCount) = Trim(Replace(InputArray(i + 3, 1), "Expiration Date:", ""))

                '~~> Check for Other and store in array
                If i + 4 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 4, 1)), 2)) = "OT" _
                Then OutputArray(5, recCount) = Trim(Replace(InputArray(i + 4, 1), "Other:", ""))

                recCount = recCount + 1
            End If
        Next i
    End With

    '~~> Output it to relevant sheet
    Sheet2.Range("A1").Resize(5, recCount - 1).Value = OutputArray
End Sub

演示:

Sub TP()

Dim wk As Worksheet: Set wk = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long: lr = wk.Cells(wk.Rows.Count, "A").End(xlUp).row

Dim rng As Range
Dim i As Long
Dim j As Long
j = 4
For i = 3 To lr

    Set rng = wk.Range(Cells(i, 1), Cells(i, 1).End(xlDown))
        wk.Cells(2, j).Value = rng.Cells(1, 1).Value

    Set fnd = rng.Find("Ounces")
        If Not fnd Is Nothing Then wk.Cells(3, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Concentration")
        If Not fnd Is Nothing Then wk.Cells(4, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Expiration")
        If Not fnd Is Nothing Then wk.Cells(5, j).Value = Right(fnd.Value, Len(fnd.Value) - Len(Split(fnd.Value, ":")(0)) - 2)
        Set fnd = Nothing
    Set fnd = rng.Find("Other")
        If Not fnd Is Nothing Then wk.Cells(6, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing

    i = Cells(i, 1).End(xlDown).row + 1
    j = j + 1
Next

End Sub
Option Explicit

Sub Sample()
    Dim InputArray As Variant
    Dim ws As Worksheet
    Dim i As Long
    Dim recCount As Long
    Dim lRow As Long
    Dim OutputArray() As String

    '~~> Set relevant input sheet
    Set ws = Sheet1

    With ws
        '~~> Find Last Row in Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Store col A in array
        InputArray = .Range("A1:A" & lRow).Value

        '~~> Find Total number of records
        For i = LBound(InputArray) To UBound(InputArray)
            If IsDate(InputArray(i, 1)) Then recCount = recCount + 1
        Next i

        '~~> Create an array for output
        ReDim OutputArray(1 To 5, 1 To recCount + 1)

        recCount = 2

        '~~> Fill Col A of output array
        OutputArray(1, 1) = "Title"
        OutputArray(2, 1) = "Ounces"
        OutputArray(3, 1) = "Concentration"
        OutputArray(4, 1) = "Expiration Date"
        OutputArray(5, 1) = "Other"

        '~~> Loop through input array
        For i = UBound(InputArray) To LBound(InputArray) Step -1
            If IsDate(InputArray(i, 1)) Then '< Check if date
                OutputArray(1, recCount) = InputArray(i, 1)

                '~~> Check for Ounces and store in array
                If i + 1 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 1, 1)), 2)) = "OU" _
                Then OutputArray(2, recCount) = Trim(Replace(InputArray(i + 1, 1), "Ounces:", ""))

                '~~> Check for Concentration and store in array
                If i + 2 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 2, 1)), 2)) = "CO" _
                Then OutputArray(3, recCount) = Trim(Replace(InputArray(i + 2, 1), "Concentration:", ""))

                '~~> Check for Expiration Date and store in array
                If i + 3 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 3, 1)), 2)) = "EX" _
                Then OutputArray(4, recCount) = Trim(Replace(InputArray(i + 3, 1), "Expiration Date:", ""))

                '~~> Check for Other and store in array
                If i + 4 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 4, 1)), 2)) = "OT" _
                Then OutputArray(5, recCount) = Trim(Replace(InputArray(i + 4, 1), "Other:", ""))

                recCount = recCount + 1
            End If
        Next i
    End With

    '~~> Output it to relevant sheet
    Sheet2.Range("A1").Resize(5, recCount - 1).Value = OutputArray
End Sub

剥猫皮的方法有很多。这里有一种使用数组的方法,它比在范围内循环快得多

工作表:

Sub TP()

Dim wk As Worksheet: Set wk = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long: lr = wk.Cells(wk.Rows.Count, "A").End(xlUp).row

Dim rng As Range
Dim i As Long
Dim j As Long
j = 4
For i = 3 To lr

    Set rng = wk.Range(Cells(i, 1), Cells(i, 1).End(xlDown))
        wk.Cells(2, j).Value = rng.Cells(1, 1).Value

    Set fnd = rng.Find("Ounces")
        If Not fnd Is Nothing Then wk.Cells(3, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Concentration")
        If Not fnd Is Nothing Then wk.Cells(4, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Expiration")
        If Not fnd Is Nothing Then wk.Cells(5, j).Value = Right(fnd.Value, Len(fnd.Value) - Len(Split(fnd.Value, ":")(0)) - 2)
        Set fnd = Nothing
    Set fnd = rng.Find("Other")
        If Not fnd Is Nothing Then wk.Cells(6, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing

    i = Cells(i, 1).End(xlDown).row + 1
    j = j + 1
Next

End Sub
Option Explicit

Sub Sample()
    Dim InputArray As Variant
    Dim ws As Worksheet
    Dim i As Long
    Dim recCount As Long
    Dim lRow As Long
    Dim OutputArray() As String

    '~~> Set relevant input sheet
    Set ws = Sheet1

    With ws
        '~~> Find Last Row in Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Store col A in array
        InputArray = .Range("A1:A" & lRow).Value

        '~~> Find Total number of records
        For i = LBound(InputArray) To UBound(InputArray)
            If IsDate(InputArray(i, 1)) Then recCount = recCount + 1
        Next i

        '~~> Create an array for output
        ReDim OutputArray(1 To 5, 1 To recCount + 1)

        recCount = 2

        '~~> Fill Col A of output array
        OutputArray(1, 1) = "Title"
        OutputArray(2, 1) = "Ounces"
        OutputArray(3, 1) = "Concentration"
        OutputArray(4, 1) = "Expiration Date"
        OutputArray(5, 1) = "Other"

        '~~> Loop through input array
        For i = UBound(InputArray) To LBound(InputArray) Step -1
            If IsDate(InputArray(i, 1)) Then '< Check if date
                OutputArray(1, recCount) = InputArray(i, 1)

                '~~> Check for Ounces and store in array
                If i + 1 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 1, 1)), 2)) = "OU" _
                Then OutputArray(2, recCount) = Trim(Replace(InputArray(i + 1, 1), "Ounces:", ""))

                '~~> Check for Concentration and store in array
                If i + 2 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 2, 1)), 2)) = "CO" _
                Then OutputArray(3, recCount) = Trim(Replace(InputArray(i + 2, 1), "Concentration:", ""))

                '~~> Check for Expiration Date and store in array
                If i + 3 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 3, 1)), 2)) = "EX" _
                Then OutputArray(4, recCount) = Trim(Replace(InputArray(i + 3, 1), "Expiration Date:", ""))

                '~~> Check for Other and store in array
                If i + 4 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 4, 1)), 2)) = "OT" _
                Then OutputArray(5, recCount) = Trim(Replace(InputArray(i + 4, 1), "Other:", ""))

                recCount = recCount + 1
            End If
        Next i
    End With

    '~~> Output it to relevant sheet
    Sheet2.Range("A1").Resize(5, recCount - 1).Value = OutputArray
End Sub
我是为了编码,假设数据在
Sheet1
中,如下所示

逻辑:

Sub TP()

Dim wk As Worksheet: Set wk = ThisWorkbook.Worksheets("Sheet1")
Dim lr As Long: lr = wk.Cells(wk.Rows.Count, "A").End(xlUp).row

Dim rng As Range
Dim i As Long
Dim j As Long
j = 4
For i = 3 To lr

    Set rng = wk.Range(Cells(i, 1), Cells(i, 1).End(xlDown))
        wk.Cells(2, j).Value = rng.Cells(1, 1).Value

    Set fnd = rng.Find("Ounces")
        If Not fnd Is Nothing Then wk.Cells(3, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Concentration")
        If Not fnd Is Nothing Then wk.Cells(4, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing
    Set fnd = rng.Find("Expiration")
        If Not fnd Is Nothing Then wk.Cells(5, j).Value = Right(fnd.Value, Len(fnd.Value) - Len(Split(fnd.Value, ":")(0)) - 2)
        Set fnd = Nothing
    Set fnd = rng.Find("Other")
        If Not fnd Is Nothing Then wk.Cells(6, j).Value = Split(fnd.Value, ":")(1)
        Set fnd = Nothing

    i = Cells(i, 1).End(xlDown).row + 1
    j = j + 1
Next

End Sub
Option Explicit

Sub Sample()
    Dim InputArray As Variant
    Dim ws As Worksheet
    Dim i As Long
    Dim recCount As Long
    Dim lRow As Long
    Dim OutputArray() As String

    '~~> Set relevant input sheet
    Set ws = Sheet1

    With ws
        '~~> Find Last Row in Col A
        lRow = .Range("A" & .Rows.Count).End(xlUp).Row

        '~~> Store col A in array
        InputArray = .Range("A1:A" & lRow).Value

        '~~> Find Total number of records
        For i = LBound(InputArray) To UBound(InputArray)
            If IsDate(InputArray(i, 1)) Then recCount = recCount + 1
        Next i

        '~~> Create an array for output
        ReDim OutputArray(1 To 5, 1 To recCount + 1)

        recCount = 2

        '~~> Fill Col A of output array
        OutputArray(1, 1) = "Title"
        OutputArray(2, 1) = "Ounces"
        OutputArray(3, 1) = "Concentration"
        OutputArray(4, 1) = "Expiration Date"
        OutputArray(5, 1) = "Other"

        '~~> Loop through input array
        For i = UBound(InputArray) To LBound(InputArray) Step -1
            If IsDate(InputArray(i, 1)) Then '< Check if date
                OutputArray(1, recCount) = InputArray(i, 1)

                '~~> Check for Ounces and store in array
                If i + 1 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 1, 1)), 2)) = "OU" _
                Then OutputArray(2, recCount) = Trim(Replace(InputArray(i + 1, 1), "Ounces:", ""))

                '~~> Check for Concentration and store in array
                If i + 2 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 2, 1)), 2)) = "CO" _
                Then OutputArray(3, recCount) = Trim(Replace(InputArray(i + 2, 1), "Concentration:", ""))

                '~~> Check for Expiration Date and store in array
                If i + 3 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 3, 1)), 2)) = "EX" _
                Then OutputArray(4, recCount) = Trim(Replace(InputArray(i + 3, 1), "Expiration Date:", ""))

                '~~> Check for Other and store in array
                If i + 4 < UBound(InputArray) + 1 Then _
                If UCase(Left(Trim(InputArray(i + 4, 1)), 2)) = "OT" _
                Then OutputArray(5, recCount) = Trim(Replace(InputArray(i + 4, 1), "Other:", ""))

                recCount = recCount + 1
            End If
        Next i
    End With

    '~~> Output it to relevant sheet
    Sheet2.Range("A1").Resize(5, recCount - 1).Value = OutputArray
End Sub
  • 将工作表中的数据存储在数组中;我们称之为
    InputArray
  • 创建用于存储数据的输出阵列;我们称之为
    OutputArray
  • 通过
    InputArray
    循环查找日期,然后查找其余记录。存储在
    OutputArray
  • 将输出从
    OutputArray
    导入相关工作表
  • 代码:

    Sub TP()
    
    Dim wk As Worksheet: Set wk = ThisWorkbook.Worksheets("Sheet1")
    Dim lr As Long: lr = wk.Cells(wk.Rows.Count, "A").End(xlUp).row
    
    Dim rng As Range
    Dim i As Long
    Dim j As Long
    j = 4
    For i = 3 To lr
    
        Set rng = wk.Range(Cells(i, 1), Cells(i, 1).End(xlDown))
            wk.Cells(2, j).Value = rng.Cells(1, 1).Value
    
        Set fnd = rng.Find("Ounces")
            If Not fnd Is Nothing Then wk.Cells(3, j).Value = Split(fnd.Value, ":")(1)
            Set fnd = Nothing
        Set fnd = rng.Find("Concentration")
            If Not fnd Is Nothing Then wk.Cells(4, j).Value = Split(fnd.Value, ":")(1)
            Set fnd = Nothing
        Set fnd = rng.Find("Expiration")
            If Not fnd Is Nothing Then wk.Cells(5, j).Value = Right(fnd.Value, Len(fnd.Value) - Len(Split(fnd.Value, ":")(0)) - 2)
            Set fnd = Nothing
        Set fnd = rng.Find("Other")
            If Not fnd Is Nothing Then wk.Cells(6, j).Value = Split(fnd.Value, ":")(1)
            Set fnd = Nothing
    
        i = Cells(i, 1).End(xlDown).row + 1
        j = j + 1
    Next
    
    End Sub
    
    Option Explicit
    
    Sub Sample()
        Dim InputArray As Variant
        Dim ws As Worksheet
        Dim i As Long
        Dim recCount As Long
        Dim lRow As Long
        Dim OutputArray() As String
    
        '~~> Set relevant input sheet
        Set ws = Sheet1
    
        With ws
            '~~> Find Last Row in Col A
            lRow = .Range("A" & .Rows.Count).End(xlUp).Row
    
            '~~> Store col A in array
            InputArray = .Range("A1:A" & lRow).Value
    
            '~~> Find Total number of records
            For i = LBound(InputArray) To UBound(InputArray)
                If IsDate(InputArray(i, 1)) Then recCount = recCount + 1
            Next i
    
            '~~> Create an array for output
            ReDim OutputArray(1 To 5, 1 To recCount + 1)
    
            recCount = 2
    
            '~~> Fill Col A of output array
            OutputArray(1, 1) = "Title"
            OutputArray(2, 1) = "Ounces"
            OutputArray(3, 1) = "Concentration"
            OutputArray(4, 1) = "Expiration Date"
            OutputArray(5, 1) = "Other"
    
            '~~> Loop through input array
            For i = UBound(InputArray) To LBound(InputArray) Step -1
                If IsDate(InputArray(i, 1)) Then '< Check if date
                    OutputArray(1, recCount) = InputArray(i, 1)
    
                    '~~> Check for Ounces and store in array
                    If i + 1 < UBound(InputArray) + 1 Then _
                    If UCase(Left(Trim(InputArray(i + 1, 1)), 2)) = "OU" _
                    Then OutputArray(2, recCount) = Trim(Replace(InputArray(i + 1, 1), "Ounces:", ""))
    
                    '~~> Check for Concentration and store in array
                    If i + 2 < UBound(InputArray) + 1 Then _
                    If UCase(Left(Trim(InputArray(i + 2, 1)), 2)) = "CO" _
                    Then OutputArray(3, recCount) = Trim(Replace(InputArray(i + 2, 1), "Concentration:", ""))
    
                    '~~> Check for Expiration Date and store in array
                    If i + 3 < UBound(InputArray) + 1 Then _
                    If UCase(Left(Trim(InputArray(i + 3, 1)), 2)) = "EX" _
                    Then OutputArray(4, recCount) = Trim(Replace(InputArray(i + 3, 1), "Expiration Date:", ""))
    
                    '~~> Check for Other and store in array
                    If i + 4 < UBound(InputArray) + 1 Then _
                    If UCase(Left(Trim(InputArray(i + 4, 1)), 2)) = "OT" _
                    Then OutputArray(5, recCount) = Trim(Replace(InputArray(i + 4, 1), "Other:", ""))
    
                    recCount = recCount + 1
                End If
            Next i
        End With
    
        '~~> Output it to relevant sheet
        Sheet2.Range("A1").Resize(5, recCount - 1).Value = OutputArray
    End Sub
    
    选项显式
    子样本()
    作为变量的Dim输入阵列
    将ws设置为工作表
    我想我会坚持多久
    我认为时间很长
    暗淡的光线和长的一样
    Dim OutputArray()作为字符串
    “~~>设置相关的输入表
    设置ws=Sheet1
    与ws
    “~~>查找A列中的最后一行
    lRow=.Range(“A”&.Rows.Count).End(xlUp).Row
    “~~>将列A存储在数组中
    InputArray=.Range(“A1:A”&lRow).Value
    “~~>查找记录总数
    对于i=LBound(输入阵列)到UBound(输入阵列)
    如果是IsDate(输入阵列(i,1)),则recCount=recCount+1
    接下来我
    “~~>为输出创建一个数组
    ReDim输出阵列(1到5,1到recCount+1)
    recCount=2
    “~~>填充输出数组的A列
    输出阵列(1,1)=“标题”
    输出量(2,1)=“盎司”
    输出阵列(3,1)=“浓度”
    OutputArray(4,1)=“到期日”
    输出阵列(5,1)=“其他”
    “~~>通过输入数组循环
    对于i=UBound(输入阵列)到LBound(输入阵列)步骤-1
    如果是IsDate(输入阵列(i,1)),则“<检查是否为日期
    输出阵列(1,recCount)=输入阵列(i,1)
    “~~>检查盎司并存储在阵列中
    如果i+1检查浓度并存储在阵列中
    如果i+2