VBA宏循环仅复制一个数据单元,而不是多个数据单元

VBA宏循环仅复制一个数据单元,而不是多个数据单元,vba,excel,macros,Vba,Excel,Macros,全部 我是这里的VBA新手,在我的新工作中,我的任务是开发一些宏。目前,我正在处理一个宏,它通过一个文本文件,应用一些格式,隔离所需的数字数据,复制数据,然后将复制的信息输出到一个新的工作表中 以下是格式化代码,以确保我发布: `Perform Text-To-Columns on Column A. Delimited by the character "#" Columns("A:A").Select Selection.TextToColumns Destination:=Range("A

全部

我是这里的VBA新手,在我的新工作中,我的任务是开发一些宏。目前,我正在处理一个宏,它通过一个文本文件,应用一些格式,隔离所需的数字数据,复制数据,然后将复制的信息输出到一个新的工作表中

以下是格式化代码,以确保我发布:

`Perform Text-To-Columns on Column A. Delimited by the character "#"
Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
    :="#", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

`Perform Text-To-Columns on Column B. Delimited by the character ")"
Columns("B:B").Select
Selection.TextToColumns Destination:=Range("B1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
    :=")", FieldInfo:=Array(1, 1), TrailingMinusNumbers:=True

`Format Column B for Numbers to have zero decimal places
Selection.NumberFormat = "0"

`Filter Column B for all numbers greater than 500
Selection.AutoFilter
ActiveSheet.Range("$B$1:$B$1720").AutoFilter Field:=1, Criteria1:=">500", _
    Operator:=xlAnd

`Sort Filtered numbers from lowest to highest
ActiveWorkbook.Worksheets(1).Sort.SortFields.Clear
ActiveWorkbook.Worksheets(1).Sort.SortFields.Add Key:=Range( _
    "B1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
    xlSortNormal
With ActiveWorkbook.Worksheets(1).Sort
    .SetRange Range("B1").EntireColumn
    .Header = xlNo
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With
现在,我有了B列,其中包含12位数字,这些数字随文件而异。宏的下一部分是一个循环,现在应该查看B列,并开始检查B列的单元格,查看它们是否包含12位数字,如果包含12位数字,则开始将其复制为一个范围。找到B中的所有12位数字后,应将其全部复制,打开新选项卡,并粘贴结果:

' Declare loop variables
    Dim myLastRow As Long
    Dim myRow As Long
    Dim i As Long
    Dim myValue As String
    Dim myStartRow As Long
    Dim myEndRow As Long

'   Find last row with data in column B
    myLastRow = Cells(Rows.Count, "B").End(xlUp).Row

'   Loop through all data in column B until you find a 12 order number Number
    For myRow = 1 To myLastRow
'       If 12 digit entry is found, capture the row number,
'       then go down until you find the first entry not 12 digits long
        If (Len(Cells(myRow, "B")) = 12) And (IsNumeric(Cells(myRow, "B"))) Then
            myStartRow = myRow
            i = 1
            Do
                If Len(Cells(myRow + i, "B")) <> 12 Then
'               If found, capture row number of the last 13 digit cell
                    myEndRow = myRow + i - 1
'                   Copy the selected data
                    Range(Cells(myStartRow, "B"), Cells(myEndRow, "B")).Copy
'                   Add "Results" as a new sheet for the copied Card Numbers to be pasted into
                    Sheets.Add.Name = "Results"
                    Sheets("Results").Activate
'                   Paste clipboard to "Results" and format the results for viewing
                    Range("A1").Select
                    ActiveSheet.Paste
                    Columns("A:A").EntireColumn.AutoFit
                    Application.CutCopyMode = False
                    Exit Do
                Else
'               Otherwise, move row counter down one and continue
                    i = i + 1
                End If
            Loop
            Exit For
        End If
    Next myRow
”声明循环变量
暗淡的麦拉斯托如长
让我的行变长
我想我会坚持多久
将myValue设置为字符串
我的头发和头发一样长
暗淡的髓鞘一样长
'查找B列中包含数据的最后一行
myLastRow=单元格(Rows.Count,“B”).End(xlUp).Row
'循环浏览B列中的所有数据,直到找到12个订单号
对于myRow=1到MyAstrow
'如果找到12位条目,则捕获行号,
'然后往下走,直到发现第一个条目的长度不是12位
如果(Len(Cells(myRow,“B”))=12)和(IsNumeric(Cells(myRow,“B”))那么
myStartRow=myRow
i=1
做
如果Len(单元格(myRow+i,“B”))12,则
'如果找到,则捕获最后13位单元格的行号
myEndRow=myRow+i-1
'复制所选数据
范围(单元格(myStartRow,“B”)、单元格(myEndRow,“B”)。复制
'将“结果”添加为要粘贴到的复制卡号的新页
Sheets.Add.Name=“结果”
工作表(“结果”)。激活
'将剪贴板粘贴到“结果”并格式化结果以供查看
范围(“A1”)。选择
活动表。粘贴
列(“A:A”).entireclumn.AutoFit
Application.CutCopyMode=False
退出Do
其他的
'否则,将行计数器向下移动一个并继续
i=i+1
如果结束
环
退出
如果结束
下一个myRow

不管出于什么原因,当我遍历宏时,它所做的只是捕获B1中的第一个值,然后将其放入结果表中。我一辈子都不知道为什么。可能是因为我应用了过滤吗?如果有人能给我一些见解,我会洗耳恭听的。非常感谢你能提供的任何帮助

这是一个相当简单的代码,似乎可以工作。希望它能满足您的需求:

Sub test1()

Dim ws As Worksheet
Dim res As Worksheet
Dim val As String

Set ws = ActiveSheet
Sheets.Add
Set res = ActiveSheet
res.Name = "Results"
ws.Select
Range("B1").Select

While ActiveCell.Value <> ""

If Len(ActiveCell.Value) = 12 Then

val = ActiveCell.Value
res.Select
ActiveCell.Value = val
ActiveCell.Offset(1, 0).Select
ws.Select
ActiveCell.Offset(1, 0).Select

Else

ActiveCell.Offset(1, 0).Select

End If

Wend

res.Select
Columns("A:A").EntireColumn.AutoFit
Range("A1").Select

End Sub
子测试1()
将ws设置为工作表
将res设置为工作表
作为字符串的Dim val
设置ws=ActiveSheet
表。添加
Set res=ActiveSheet
res.Name=“结果”
ws.Select
范围(“B1”)。选择
而ActiveCell.Value为“”
如果Len(ActiveCell.Value)=12,则
val=ActiveCell.Value
res.选择
ActiveCell.Value=val
ActiveCell.Offset(1,0)。选择
ws.Select
ActiveCell.Offset(1,0)。选择
其他的
ActiveCell.Offset(1,0)。选择
如果结束
温德
res.选择
列(“A:A”).entireclumn.AutoFit
范围(“A1”)。选择
端接头

这是一个相当简单的代码,似乎可以工作。希望它能满足您的需求:

Sub test1()

Dim ws As Worksheet
Dim res As Worksheet
Dim val As String

Set ws = ActiveSheet
Sheets.Add
Set res = ActiveSheet
res.Name = "Results"
ws.Select
Range("B1").Select

While ActiveCell.Value <> ""

If Len(ActiveCell.Value) = 12 Then

val = ActiveCell.Value
res.Select
ActiveCell.Value = val
ActiveCell.Offset(1, 0).Select
ws.Select
ActiveCell.Offset(1, 0).Select

Else

ActiveCell.Offset(1, 0).Select

End If

Wend

res.Select
Columns("A:A").EntireColumn.AutoFit
Range("A1").Select

End Sub
子测试1()
将ws设置为工作表
将res设置为工作表
作为字符串的Dim val
设置ws=ActiveSheet
表。添加
Set res=ActiveSheet
res.Name=“结果”
ws.Select
范围(“B1”)。选择
而ActiveCell.Value为“”
如果Len(ActiveCell.Value)=12,则
val=ActiveCell.Value
res.选择
ActiveCell.Value=val
ActiveCell.Offset(1,0)。选择
ws.Select
ActiveCell.Offset(1,0)。选择
其他的
ActiveCell.Offset(1,0)。选择
如果结束
温德
res.选择
列(“A:A”).entireclumn.AutoFit
范围(“A1”)。选择
端接头

我不确定是否理解,但您可以尝试以下方法:

Option Explicit

Sub CopyNumber()

Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Sheet1") 'Change the name of the sheet
Dim Result As Worksheet

Dim ws1Lastrow As Long, LastrowResult As Long
Dim i As Long, Rng As Range
Dim TestLenght, Arr

Sheets.Add.Name = "Results" ' Add your new sheet
Set Result = ThisWorkbook.Sheets("Results")

With ws1

    ws1Lastrow = .Range("B" & Rows.Count).End(xlUp).Row 'Find the lastrow in the Source Data Sheet
    Set Rng = .Range("B1:B" & ws1Lastrow) 'Set your range to put into your Array
    Arr = Rng.Value

For i = LBound(Arr) To UBound(Arr)

    TestLenght = Arr(i, 1)

            If Len(Trim(TestLenght)) = 12 And IsNumeric(TestLenght) Then ' Test your data

                    LastrowResult = Result.Range("A" & Rows.Count).End(xlUp).Row + 1
                    Result.Cells(LastrowResult, "A") = TestLenght ' Past your data from your array to the Result Sheet

            End If

Next ' next data of the Array

End With

End Sub

我不确定是否理解,但您可以尝试以下方法:

Option Explicit

Sub CopyNumber()

Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Sheet1") 'Change the name of the sheet
Dim Result As Worksheet

Dim ws1Lastrow As Long, LastrowResult As Long
Dim i As Long, Rng As Range
Dim TestLenght, Arr

Sheets.Add.Name = "Results" ' Add your new sheet
Set Result = ThisWorkbook.Sheets("Results")

With ws1

    ws1Lastrow = .Range("B" & Rows.Count).End(xlUp).Row 'Find the lastrow in the Source Data Sheet
    Set Rng = .Range("B1:B" & ws1Lastrow) 'Set your range to put into your Array
    Arr = Rng.Value

For i = LBound(Arr) To UBound(Arr)

    TestLenght = Arr(i, 1)

            If Len(Trim(TestLenght)) = 12 And IsNumeric(TestLenght) Then ' Test your data

                    LastrowResult = Result.Range("A" & Rows.Count).End(xlUp).Row + 1
                    Result.Cells(LastrowResult, "A") = TestLenght ' Past your data from your array to the Result Sheet

            End If

Next ' next data of the Array

End With

End Sub

我认为问题可能在于将数字格式化为显示0个小数位与截断数字不同。函数的作用是计算单元格的实际内容(或真值),而不是显示的值。因此,如果这些数字有小数,Len()将返回大于12的值,因为它将计算小数点和小数


如果是这个问题,您需要将小数点舍入到0位(或截断为整数),以便强制实际单元格内容的长度为12

我认为问题可能在于将数字格式化为显示0个小数位与截断数字不同。函数的作用是计算单元格的实际内容(或真值),而不是显示的值。因此,如果这些数字有小数,Len()将返回大于12的值,因为它将计算小数点和小数


如果是这个问题,您需要将小数点舍入到0位(或截断为整数),以便强制实际单元格内容的长度为12

是B2 12中值的长度?否。在此特定示例中,B1-B130的长度均应为12。我确实在一步中注意到,它在仅仅通过一次之后就从DO循环中退出,但我无法解释原因。您是否对B1进行了简单的测试,以确保Len(单元格(myRow+I,“B”))真的等于12,并且在末尾没有空格?是B2中的值的长度12?否。在此特定示例中,B1-B130的长度均应为12。我确实在一步中注意到它在仅仅通过一次后就从DO循环中退出,但我无法解释原因。您是否对B1进行了简单测试,以确保Len(单元格(myRow+I,“B”))真的等于12,并且您没有在最后得到一个空格?谢谢您的回答,但当我在我的工作中尝试了这一点时