如何跨列检查值,然后复制下面一个单元格的内容?

时间:2015-05-13 02:01:16

标签: excel excel-vba vba

所以我有一张excel表,一周的日子从D7开始,延伸到AF7,持续15天。我想查看它们中的每一个,然后将第8行中正下方单元格的内容复制到另一个工作表中。

我得到运行时错误1004对象_Global的方法范围在此行上失败。我对VBA很新,所以我不确定出了什么问题。

LastCol = Range(Cells(7, Columns.Count)).End(xlUp).Columns

完整代码:

Sub Copy()
    Dim cell As Range
    Dim lastRow As Long, i As Long

    LastCol = Range(Cells(7, Columns.Count)).End(xlUp).Columns
    i = 4

    For Each cell In Sheets(1).Range(LastCol & "D7:7")
        If cell.Value = "MON" Then
            cell.Offset(-1, 0).Copy Sheets(2).Cells(1, i)
            i = i + 1
        End If
    Next

End Sub

2 个答案:

答案 0 :(得分:1)

要获取最后一个,即最右边的一行,首先将MyRow设置为您要使用的行:

lastcol= ActiveSheet.Cells(MyRow, Columns.Count).End(xlToLeft).Column

对于最后一行,将MyColumn设置为适当的值后:

lastrow = ActiveSheet.Cells(Rows.Count, MyColumn).End(xlUp).Row

但你的范围参考也不是很正确。就个人而言,我没有看到在循环中使用范围变量的价值。你可以试试这个。 (请注意,负偏移量会读取上面的行,而不是下面的行)

Sub Copy()
Dim lastRow As Long, i As Long, LocX as long
Dim source As Worksheet, dest As Worksheet
Set source = Sheets(1)
Set dest = Sheets(2)
lastcol = source.Cells(7, Columns.Count).End(xlToLeft).Column
i = 4
For locX = 4 To lastcol
    If source.Cells(7, locX).Value = "mon" Then
        source.Cells(7, locX).Offset(1, 0).Copy dest.Cells(1, i)
        i = i + 1
    End If
Next
End Sub

答案 1 :(得分:0)

您分配给 LastCol 的名称似乎表示您希望获取列号但尚未使用xlUp而不是xlToLeft。此外,您要求的是.Columns,而不是Column

LastCol = Cells(7, Columns.Count).End(xlToLeft).Column

这将返回第7行中最后一个使用列的列号(例如,列F = 6,列AA = 27等)。

with Sheets(1)
    LastCol = .Cells(7, Columns.Count).End(xlToLeft).Column
    For Each cell In .cells(7, "D").resize(1, LastCol - 3)
        If ucase(cell.Value) = "MON" Then
            cell.Offset(1, 0).Copy destination:=Sheets(2).Cells(1, i)
            i = i + 1
        End If
    Next
end with
  1. 您是否使用自定义数字格式 ddd 在第7行中使用实际日期?如果是这种情况,那么您应该使用If weekday(cell.Value) = 2 Then而不是检查 MON
  2. 如果你想复制它们正下方单元格的内容那么你的偏移应该是1行而不是-1行;例如cell.Offset(1, 0).Copy