VBA宏循环仅复制一个数据单元,而不是多个数据单元
全部 我是这里的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
`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,并且您没有在最后得到一个空格?谢谢您的回答,但当我在我的工作中尝试了这一点时