在工作表上将变量声明为特定单元格时遇到麻烦

时间:2019-02-12 02:36:36

标签: excel vba

VBA的新手。我在将变量声明为工作表上的特定单元格时遇到麻烦。

我尝试过按行和列定义单元格,但是当我把手表放在一行上时,它说Value不在上下文中。变量为testname,位于我设置为原始变量的工作表的单元格E2中。

Sub findcomponents()

    Dim raw As Worksheet
    Dim res As Worksheet
    Dim temp As Worksheet
    Dim testname As String
    Dim finalrow1 As Integer
    Dim finalrow2 As Integer
    Dim i As Integer



    Set raw = Worksheets("rawdata")
    Set res = Worksheets("resultcomponents")
    Set temp = Worksheets("uploadtemplate")

    testname = raw.Range("E2").Value


    finalrow1 = raw.Range("A10000").End(xlUp).Row
    finalrow2 = res.Range("A10000").End(xlUp).Row

    For i = 2 To finalrow2
        If res.Cells(i, 4) = testname Then
            Range(Cells(i, 2), Cells(i, 4)).Copy
            temp.Range("A10000").End(xlUp).Cells("A2").Paste
        End If
    Next i

    End Sub

我希望该值是E2单元格中的字符串 编辑:我添加了其余的代码。当我运行时,它什么也没做。 应该采用字符串testname并循环遍历res工作表上的列表,然后返回匹配项。我在testname行上放置了一块手表,因为我认为它将向我显示它正在比较正确的字符串,并且监视行中的Value表示

是,粘贴行不正确。我还尝试了temp.Range(“ A10000”)。End(xlUp).Offset(1、0).Paste,这也使它很生气。

此修复程序可以在工作表名称上进行编辑。但是res工作表上有1个以上的匹配项。这就是为什么我认为找到最后一行(但我应该有1行偏移量)会返回所有匹配项的原因。这确实可以返回所有值。    temp.Range(“ A10000”)。End(xlUp).Offset(1、0).PasteSpecial xlPasteValues

是否有更好的方法可以不使用Range(“ A10000”)。End(xlUp)?

1 个答案:

答案 0 :(得分:0)

您的关键问题是粘贴语句。

您可以使用以下两种方法之一进行粘贴(尽管应注意还有其他方法)

Range.Copy PasteRange

Range.Copy
PasteRange.PasteSpecial (paste type (values, formats, etc.))

对于Last Row计算,它也更新了更多标准变量块/变量名。另外,请注意,我还更新了Last Row计算,使其更加动态。最后,将Integer换成Long


Option Explicit

Sub findcomponents()

Dim raw As Worksheet: Set raw = ThisWorkbook.Sheets("rawdata")
Dim res As Worksheet: Set res = ThisWorkbook.Sheets("resultcomponents")
Dim temp As Worksheet: Set temp = ThisWorkbook.Sheets("uploadtemplate")

Dim testname As String
Dim LR1 As Long, LR2 As Long, LR3 As Long, i As Long

LR1 = raw.Range("A" & raw.Rows.Count).End(xlUp).Row  '<-- This variable is never used??
LR2 = res.Range("A" & res.Rows.Count).End(xlUp).Row  '<-- Updated for standard Last Row (LR) calculation

For i = 2 To LR2
    If res.Cells(i, 4) = raw.Range("E2") Then
        res.Range(res.Cells(i, 2), res.Cells(i, 4)).Copy  '<-- Qaulified Ranges!!
        LR3 = temp.Range("A" & temp.Rows.Count).End(xlUp).Offset(1).Row
        temp.Range("A" & LR3).PasteSpecial xlPasteValues '<-- Correct Paste Method
    End If
Next i

End Sub

使用的命名约定只是我的偏爱。在某种程度上,您可以随意命名变量,但您认为合适