Vba 如何检查单元格的符号,然后将其复制并粘贴到另一张纸上?

Vba 如何检查单元格的符号,然后将其复制并粘贴到另一张纸上?,vba,excel,loops,if-statement,Vba,Excel,Loops,If Statement,我有一列数字,想通过每个单元格检查数字是正数还是负数。在确定一个数字是正数还是负数后,我想将该数字复制并粘贴到一个新表中,该表位于一张分隔正负值的新工作表上 我最初使用了一个嵌套的if语句来实现这一点,但没有得到一个包含20个正数和20个负数的列表,而是在我的新的纯正数表中得到了一个包含20个正数和20个假条件的列表(负数也是一样) 我希望在不复制它们的情况下提取正值和负值,或者在新表中获取if语句的假条件 我一直在尝试实现的最后一件事是让代码搜索我的数字列,而不是固定范围,以便将来我可以添加数

我有一列数字,想通过每个单元格检查数字是正数还是负数。在确定一个数字是正数还是负数后,我想将该数字复制并粘贴到一个新表中,该表位于一张分隔正负值的新工作表上

我最初使用了一个嵌套的if语句来实现这一点,但没有得到一个包含20个正数和20个负数的列表,而是在我的新的纯正数表中得到了一个包含20个正数和20个假条件的列表(负数也是一样)

我希望在不复制它们的情况下提取正值和负值,或者在新表中获取if语句的假条件

我一直在尝试实现的最后一件事是让代码搜索我的数字列,而不是固定范围,以便将来我可以添加数字,新的正/负表将自动生成额外的数字

我对VBA和一般的编码相当陌生,所以非常感谢您的帮助

谢谢

奥列克


我的代码基本上遵循宏代码:

Sub Variance()
'
' Variance Macro
'

'
Range("F2:F60").Select
Selection.Copy
Sheets("Macro").Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
Range("A1:A60").Select
Application.CutCopyMode = False
Selection.NumberFormat = "0.00%"
Selection.AutoFilter
Range("A1").Select
ActiveSheet.Range("$A$1:$A$60").AutoFilter Field:=1, Criteria1:=">=0", _
    Operator:=xlAnd
ActiveWindow.SmallScroll Down:=-12
Range("A3:A60").Select
Selection.Copy
Sheets("Bullseye").Select
Range("AH3").Select
ActiveSheet.Paste
Columns("AH:AH").EntireColumn.AutoFit
ActiveWindow.SmallScroll Down:=-18
Sheets("Macro").Select
Range("A1").Select
ActiveSheet.Range("$A$1:$A$60").AutoFilter Field:=1, Criteria1:="<0", _
    Operator:=xlAnd
ActiveWindow.SmallScroll Down:=-21
Range("A2:A59").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Bullseye").Select
Range("AK3").Select
ActiveSheet.Paste
End Sub
子方差()
'
'方差宏
'
'
范围(“F2:F60”)。选择
选择,复制
工作表(“宏”)。选择
范围(“A2”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
范围(“A1:A60”)。选择
Application.CutCopyMode=False
Selection.NumberFormat=“0.00%”
自动筛选
范围(“A1”)。选择
ActiveSheet.Range(“$A$1:$A$60”)。自动筛选字段:=1,标准1:=“>=0”_
运算符:=xlAnd
ActiveWindow.small向下滚动:=-12
范围(“A3:A60”)。选择
选择,复制
床单(“斗牛士”)。选择
范围(“AH3”)。选择
活动表。粘贴
列(“AH:AH”).entireclumn.AutoFit
ActiveWindow.small向下滚动:=-18
工作表(“宏”)。选择
范围(“A1”)。选择

ActiveSheet.Range(“$A$1:$A$60”)。自动筛选字段:=1,Criteria1:=”您可以尝试使用变量。在这种情况下,变量RowNum为F列中的最后一个值查找行数。然后,您可以在代码的每个位置用变量RowNum替换数字60,使您的范围动态如下:

    Dim RowNum As Integer

    RowNum = Sheets("Macro").Cells(Rows.Count, "F").End(xlUp).Row
    Range("F2:F" & RowNum).Select    
    '...
    Range("A2:A" & RowNum).Select

您必须避免所有
选择
/
选择
/
激活
/
ActiveXXX
模式设计,这是99,99%不必要的,并切换到完全合格的范围参考

此外,您不需要任何“中间”表作为“宏”,因为您可以直接就地过滤数据

Option Explicit

Sub Variance()
    With Worksheets("numbersSheet") '<--| reference your data worksheet (change "numbersSheet" to your actual sheet with numbers name)
        With Range("F1", .Cells(.Rows.count, "F").End(xlUp)) '<--| reference its column "F" range from row 1 (header) down to last not empty row
            FilterAndWrite .Cells, ">=0", Worksheets("Bullseye").Range("AH3") '<--| filter positive or zero values and write them from Worksheets("Bullseye").Range("AH3") downwards
            FilterAndWrite .Cells, "<0", Worksheets("Bullseye").Range("AK3") '<--| filter negative values and write them from Worksheets("Bullseye").Range("AK3") downwards
        End With
        .AutoFilterMode = False
    End With
End Sub

Sub FilterAndWrite(sourceRng As Range, criterium As String, targetRng As Range)
    With sourceRng
        .AutoFilter Field:=1, Criteria1:=criterium
        If Application.WorksheetFunction.Subtotal(103, .Cells) > 1 Then '<--| if any filtered cells other than header
            .Resize(.Rows.count - 1).Offset(1).SpecialCells(xlCellTypeVisible).Copy '<--| copy filtered cell skipping header
            targetRng.PasteSpecial xlPasteValues '<--| paste values in passed target range
        End If
    End With
End Sub
选项显式
次级方差()

使用工作表(“数字表”)时,请添加代码在没有看到代码的情况下很难看到问题所在。请编辑您的帖子以将其包括在内。@Olek,您完成了吗?