基于标准提取数据



我有两张纸,"SA""SB";。

我正试图从";SA";至";SB";。

我正在尝试使用代码中的条件。(稍后,这将基于用户从组合框中选择的标准。(

我希望从"表"中的整行(或者更好地填充到最后一列(;SA";被复制到片材中";SB";如果列BORJ中的值为="0";123456789";。

在我的代码中,一些行被粘贴在同一行的顶部,而不是下一行。

Sub test()
Dim SA As Worksheet
Dim SB As Worksheet

Set SA = Worksheets("SA")
Set SB = Worksheets("SB")

Dim DBSLRow As Long
Dim ResultLRow As Long
Dim i As Long
SALRow = SA.Cells(Rows.Count, 1).End(xlUp).Row
SBLRow = SB.Cells(Rows.Count, 1).End(xlUp).Row

Debug.Print SALRow
Debug.Print SBLRow

For i = 1 To SALRow
If Cells(i, 2) = "123456789" Or Cells(i, 10) = "123456789" Then
SA.Cells(i, 1).EntireRow.Copy
SB.Cells(SBLRow, 1).PasteSpecial
SBLRow = SBLRow + 1
Else

End If
Next

End Sub

我已经阅读了其他问题,无法了解错误
也许还有更好的方法。

For循环会自动递增迭代器,如果在循环中执行i = i + 1,则会跳过行。

我不知道你的代码会在哪里或为什么粘贴在现有数据上,除非你在列A中没有数据,否则我不会这么做。但是,你可以增加SBLRow,而不是每次重新计算最后一行(它永远不会增加超过1(。

你也应该使用Option Explicit,从长远来看,它会让你的生活轻松很多。

Option Explicit
Sub test()
Dim SA As Worksheet
Dim SB As Worksheet
Dim SALRow As Long 'Declare all your variables
Dim SBLRow As Long
Dim i As Long
Set SA = Worksheets("SA")
Set SB = Worksheets("SB")
SALRow = SA.Cells(SA.Rows.Count, 1).End(xlUp).Row
SBLRow = SB.Cells(SB.Rows.Count, 1).End(xlUp).Row
Debug.Print SALRow
Debug.Print SBLRow
With SA 'Good practice to always use explicit qualifiers
For i = 1 To SALRow
If .Cells(i, 2) = "123456789" Or .Cells(i, 10) = "123456789" Then
.Cells(i, 1).EntireRow.Copy SB.Cells(SBLRow, 1)
SBLRow = SBLRow + 1
End If
Next
End With
End Sub

首先,您需要避免类型不匹配(不会返回错误(,并使用单元格作为工作表的属性

If SA.Cells(i, 2) = "123456789" Or SA.Cells(i, 10) = "123456789" Then

通过取"123456789"内部"你说要编程它是字符串类型,但你没有在Cells(i,2(中设置属性。你可以检查一下。此单元格的值或。文本如果您没有选择属性程序将检查默认属性。总是像下面的一样使用

If SA.Cells(i, 2).Value = 123456789  ' to check value // number type of data /integer/long/double etc
If SA.Cells(i, 2).Text= "123456789"  ' to check text string // text type of data / String

最好的选择是声明变量并将值设置为类似

dim str_Text as String : str_Text = "123456789" 
dim lng_Text as Long: lng_Text = 123456789

然后检查条件

If SA.Cells(i, 2).Text= str_Text 
If SA.Cells(i, 2).Value= lng_Text 

下一个

SBLRow = SB.Cells(Rows.Count, 1).End(xlUp).Row + 1

如果你不把最后一行设置为上一行,当i=1时,你会把项目粘贴到被占用的行中。

并删除i的增量,它将在下一步中递增。尝试低于代码

Sub test()
Dim SA As Worksheet
Dim SB As Worksheet
Dim str_Condition as String : str_Condition = "123456789"
Set SA = Worksheets("SA")
Set SB = Worksheets("SB")
SALRow = SA.Cells(Rows.Count, 1).End(xlUp).Row
SBLRow = SB.Cells(Rows.Count, 1).End(xlUp).Row + 1
Debug.Print SALRow
Debug.Print SBLRow
For i = 1 To SALRow
If SA.Cells(i, 2) = str_Condition  Or SA.Cells(i, 10) = str_Condition  Then
SBLRow = SB.Cells(Rows.Count, 1).End(xlUp).Row + 1
SA.Cells(i, 1).EntireRow.Copy
SB.Cells(SBLRow, 1).PasteSpecial
End If
Next i
End Sub

最新更新