Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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 如果满足条件,则循环剪切和粘贴_Vba_Excel_Loops - Fatal编程技术网

Vba 如果满足条件,则循环剪切和粘贴

Vba 如果满足条件,则循环剪切和粘贴,vba,excel,loops,Vba,Excel,Loops,我试图循环以下内容 Dim x As Integer Dim y As Integer x = Range("AE4") y = Range("AD4") If x >= y Then Range("AE4").Select Selection.Copy Range("AD4").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpo

我试图循环以下内容

Dim x As Integer
Dim y As Integer

x = Range("AE4")
y = Range("AD4")

If x >= y Then
Range("AE4").Select
Selection.Copy
Range("AD4").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False

Else

End If
一旦该单元格AE4已被检查,然后复制或不依赖于它是否大于或=AD4,我希望该单元格随后移动到数据集末尾的AE5、AE6等。你知道我下一步要做什么吗?我现在已经在检查之前执行了剩余的脚本,如果单元格日期在4周以下,然后是5周,6周到10周。当前正在按预期工作,检查单元格的日期,然后检查并复制数据中的第一个单元格

全文如下

Sub Test()

  Range("AE4").Select
    ActiveCell.Formula = _
      "=IF(RC[-2]>=TODAY()-28,""1"",IF(AND(RC[-2]<TODAY()-28,RC[-2]>=TODAY()-35),""4"",IF(AND(RC[-2]<TODAY()-35,RC[-2]>=TODAY()-42),""5"",IF(AND(RC[-2]<TODAY()-42,RC[-2]>=TODAY()-49),""6"",IF(AND(RC[-2]<TODAY()-49,RC[-2]>=TODAY()-56),""7"",IF(AND(RC[-2]<TODAY()-56,RC[-2]>=TODAY()-63),""8"",IF(AND(RC[-2]<TODAY()-63,RC[-2]>=TODAY()-70),""9"",IF(RC[-2]<TODAY()-70,""10""))))))))"
  Range("AE4").Select
  Selection.AutoFill Destination:=Range("AE4:AE200")
  Range("AE4:AE200").Select

  Dim x As Integer
  Dim y As Integer

  x = Range("AE4")
  y = Range("AD4")

  If x >= y Then
  Range("AE4").Select
  Selection.Copy
  Range("AD4").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

  Else

  End If
End Sub
子测试()
范围(“AE4”)。选择
ActiveCell。公式=_

“=如果(RC[-2]>=今天()-28”,“1”,“如果”(和)(RC[-2]=今天()-35),“4”,“如果”(和)(RC[-2]=今天()-42),“5”,“如果”(和)(和)(和)(和)(RC[-2]=今天()-49),“6”,“如果(和)(和)(和)(RC[-2]=今天()-56),“7”,“如果”(和(和)(和)(和)(RC[-2]=今天()-63),“8”,“如果”(和(和)(和)(和)(和)(和)(和)(RC[-2]=今天()-70),“9”,“如果(和)(和)(RC[-2]最简单的方法可能就是重复你正在做的lopp”)。 您不需要将x和y定义为范围,而只需要一个计数变量:

dim lastrow as integer
lastrow = Cells(Rows.count, "AE").End(xlUp).row 'counts the amount of cells you have with values in the row

for i = 2 to lastrow 'set 2 = whatever, but I guess you have header rows, if you want to start in the 4th row set it 4

if CELLS(i,31).Value >= CELLS(i,30).Value THEN 'the cell commands uses 1-indexed numbers to refer to cells on an x-y axis, rows go on the x axis so Cells(2,1) is "B1" for some reason.
    'insert your loop here
    Cells(i,31).Select
    Selection.Copy
    Cells(i,30).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
       :=False, Transpose:=False
End if
Next i

下面是一些代码,它们可以满足我认为您的要求。看起来您非常依赖宏生成器,它往往会“选择”比开发人员需要做的多得多。玩一下您的代码,看看其他帖子,看看其他人是如何做的

Sub Test()
    Dim ws As Worksheet
    Dim startCell as Range
    Dim fullRng As Range
    Dim thisCell As Range
    Dim leftCell as Range

    Set ws = ThisWorkbook.Worksheets("Sheet1")
    Set startCell = ws.Range("AE4")
    Set fullRng = startCell.Resize(196)

    startCell.Formula = "=IF(RC[-2]>=TODAY()-28,""1"",IF(AND(RC[-2]<TODAY()-28,RC[-2]>=TODAY()-35),""4"",IF(AND(RC[-2]<TODAY()-35,RC[-2]>=TODAY()-42),""5"",IF(AND(RC[-2]<TODAY()-42,RC[-2]>=TODAY()-49),""6"",IF(AND(RC[-2]<TODAY()-49,RC[-2]>=TODAY()-56),""7"",IF(AND(RC[-2]<TODAY()-56,RC[-2]>=TODAY()-63),""8"",IF(AND(RC[-2]<TODAY()-63,RC[-2]>=TODAY()-70),""9"",IF(RC[-2]<TODAY()-70,""10""))))))))"
    startCell.AutoFill fullRng

    For Each thisCell In fullRng.Cells
        Set leftCell = thisCell.Offset(, -1)
        Debug.Print("Before If: " & thisCell.Address(False, False) & "=" & thisCell.Value2 & " v. " & leftCell.Address(False, False) & "=" & leftCell.Value2)
        If thisCell.Value2 >= leftCell.Value2 Then
            leftCell.Value2 = cell.Value2
            Debug.Print("After If: " & thisCell.Address(False, False) & "=" & thisCell.Value2 & " v. " & leftCell.Address(False, False) & "=" & leftCell.Value2)
        End If
    Next

End Sub
子测试()
将ws设置为工作表
暗淡的startCell as范围
变暗满量程
将此单元格设置为范围
暗淡的左单元格作为范围
设置ws=ThisWorkbook.Worksheets(“Sheet1”)
设置startCell=ws.Range(“AE4”)
设置fullRng=startCell.Resize(196)

startCell.Formula=“=IF(RC[-2]>=TODAY()-28”、“1”、“IF(AND(RC[-2]=TODAY()-35)、“4”、“IF(AND(RC[-2]=TODAY()-42)、“5”、“IF(AND(RC[-2]=TODAY()-49)、“6”、“IF(AND(RC[-2]=TODAY()-56)、“7”、“IF(AND(AND(RC[-2]=TODAY()-63)、“8”、“IF(AND(RC[-2]=TODAY()-70)”、“9”、“IF(RC[-2)”感谢各位,除了单元验证之外,这两种方法都有效。如果单元AE4>=AD4,则将单元AE4值复制到AD4,使用
。Select
是“不好”的编码实践,因为在VBA中不需要它。相反,您的代码应为:
工作表(“Sheet1”)。单元(i,30)。值=工作表(“Sheet1”)。单元(i,31).Value
意识到这一点;只是不想混淆更多必要的东西。它不会使事情变得更慢,而且在我看来,对于调试来说,它实际上更好,因为当您进行测试时,它更清楚代码实际执行的操作。如果您堆叠一些循环,然后必须进行调试,以查找您使用的一个单元格索引没错,这是一个巨大的痛苦。谢谢。我唯一的问题是它似乎忽略了If cell.Value>=cell.Offset(,-1)。Value然后cell.Offset(,-1).Value=cell.Value它会复制单元格值。如果该值低于此值,则我希望此操作忽略copy.Hmm。检查if语句上方的每个单元格的值。尝试调试。打印(cell.Address(False,False)&“=”和cell.Offset(,-1)。Value&“v.”和cell.Offset(,-1)。Address(False,False)&“=”和cell.Value)。我已尝试粘贴;调试。打印(单元格地址(False,False)&“=”和单元格偏移量(,-1)。值和“v.”和单元格偏移量(,-1)。地址(False,False)&“=”和单元格值)但是>=仍然被忽略,所有具有大于该cell.value的值的单元格仍然被覆盖。我也不知道这额外的行在做什么。Debug.Print行只是将单元格结果写入编辑器的即时窗口(通常位于最底部)所以你可以看到它-它会给你其中包含的单元格地址和值。我的怀疑是我们测试了错误的单元格,或者值不是我们认为应该的。刚才注意到,行应该是:Debug.Print(cell.address(False,False)&“=”&cell.value&“v.”&cell.Offset(,-1)。address(False,False)&“=”&cell.Offset(,-1)。address(False,False)&“&cell.Offset(,-1).Value)。再次运行它并查看值显示的内容。如果看不到即时窗口,请转到View->ImmediateWindow。这些值看起来都正常。AE4=5 v.AD4=9:在If语句之后添加了调试,并得到以下结果。AE4=5 v.AD4=9;AE4=5 v.AD4=5;AE5=1 v.AD5=9;AE5=1 v.AD5=1;