将单元格区域作为变量传递并使用函数复制数据

Posted

技术标签:

【中文标题】将单元格区域作为变量传递并使用函数复制数据【英文标题】:Pass a cell range as a variable and copy data using a function 【发布时间】:2022-01-12 11:40:28 【问题描述】:

我试图在 VBA 中创建一个函数,该函数根据函数的输入将数据从一张表复制到另一张表。但是,我在实际函数本身中使用函数的参数时遇到了很大的困难。

下面是我的代码:如您所见,我想要的范围现在是硬编码的,这是可行的!但是我不能让它接受我作为参数传递给函数的范围。我做错了什么?

数据应该代替范围(F35:F65),目标应该代替范围(C6)

Function Copytranspose(data As Range, target As Range)

    
    
    Worksheets("Data").Activate
    ActiveSheet.Range("F35:F65").Copy
    
    Worksheets("Totalizers").Activate
    ActiveSheet.Range("C6").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

        
End Function

Sub tempo()
Call Copytranspose(Range("F35:F65"), Range("C6"))

End Sub

【问题讨论】:

您似乎没有使用参数,您正在传递参数并且它们也是硬编码的。它将是 data.copy 和 target.pastespecial。或target.resize(data.rows.count,data.columns.count).value=data.value 您还应该为您的参数添加工作表引用,并且无需激活/选择内容。 是的,它们目前是硬编码的,只是为了测试其余部分是否有效,当我使用 data.copy 时它不起作用并引发异常@Nathan_Sav 是的,我早期的迭代之一是这样的代码:` Worksheets("Data").Range("F35:F65").Copy Worksheets("Totalizers").Range("C6" ).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False` 这仍然是一样的,它在我硬编码范围时起作用,而不是在我使用参数时。我可能没有正确传递参数,但不知道该怎么做 【参考方案1】:

复制范围的值

两个硬编码工作表(范围地址(字符串)参数)

Option Explicit

Sub CopyRange( _
        ByVal SourceRangeAddress As String, _
        ByVal DestinationFirstCellAddress As String, _
        Optional ByVal DoTranspose As Boolean = False)
    
    Dim wb As Workbook: Set wb = ThisWorkbook ' workbook containing this code

    Dim sws As Worksheet: Set sws = wb.Worksheets("Data")
    Dim srg As Range: Set srg = sws.Range(SourceRangeAddress)
    
    Dim dws As Worksheet: Set dws = wb.Worksheets("Totalizers")
    Dim dfCell As Range: Set dfCell = dws.Range(DestinationFirstCellAddress)
    
    Dim drg As Range
    
    If DoTranspose Then
        Set drg = dfCell.Resize(srg.Columns.Count, srg.Rows.Count)
        drg.Value = Application.Transpose(srg.Value)
    Else
        Set drg = dfCell.Resize(srg.Rows.Count, srg.Columns.Count)
        drg.Value = srg.Value
    End If
        
End Sub

Sub tempo()
    
    ' Either transpose...
    CopyRange "F35:F65", "C6", True ' 'C6:AG6'
    ' ... or do not transpose:
    'CopyRange "F35:F65", "C6" ' 'C6:C36'

End Sub

任何范围(范围参数)

Option Explicit

Sub CopyRange( _
        ByVal srg As Range, _
        ByVal dfCell As Range, _
        Optional ByVal DoTranspose As Boolean = False)

    Dim drg As Range
    
    If DoTranspose Then
        Set drg = dfCell.Resize(srg.Columns.Count, srg.Rows.Count)
        drg.Value = Application.Transpose(srg.Value)
    Else
        Set drg = dfCell.Resize(srg.Rows.Count, srg.Columns.Count)
        drg.Value = srg.Value
    End If
    
End Sub

Sub tempo()
    
    ' Either transpose...
    CopyRange Range("F35:F65"), Range("C6"), True ' 'C6:AG6'
    ' ... or do not transpose:
    'CopyRange Range("F35:F65"), Range("C6") ' 'C6:C36'
    
End Sub

【讨论】:

遗憾的是,这不能按预期工作,因为这两个范围位于不同的工作表上。我必须说我对 VBA 的了解不足以破译这里发生的事情。 (我还需要复制值而不是公式,因此需要特殊粘贴)。但是,我仍然不明白为什么我只能将“F35:F65”之类的东西作为字符串或其他东西传递,然后在 Range(MyVar).copy 之类的表达式中使用它 我已经发布了另一个解决方案。 这行得通!万分感谢!尽管我必须说我仍然不明白为什么需要整个调整大小,或者为什么我的代码不起作用。感谢您的帮助! 此Resize business 称为通过分配复制。您基本上是在“说”目标中的范围等于源中的范围。问题是,这只有在范围大小相同时才能正常工作。因此,您将目标第一个单元格的大小调整为源的大小。这是仅复制值的最有效(最快)的方法。大多数情况下,您甚至都没有注意到发生了什么事。选择没有改变,即您不会像使用 PasteSpecial 时那样得到选择。 谢谢,明白了很多!我会投票赞成你的答案,但我还没有特权......【参考方案2】:

这样的?

Sub CopyData(sourceRange As Excel.Range, targetRange As Excel.Range)

targetRange.Resize(sourceRange.Rows.Count, sourceRange.Columns.Count).Value = sourceRange.Value

End Sub

Sub TestCopyData()
    
CopyData Sheets("Sheet1").Range("a1:a3"), Sheets("sheet1").Range("q1")
    
End Sub

【讨论】:

为什么在这里使用 sub 而不是函数?我的(有限的)理解是我需要一个函数,因为我想在单击一个按钮内多次调用它。我已经工作了,我只是不知道如何使用参数而不是硬编码范围 函数返回一个值,你的函数没有,所以我使用了一个子。答案显示了如何使用论点,以及如何更好地完成工作?那我就交给你了。干杯 我不太理解你的代码,你能解释一下第二行吗?为什么要调整它的大小?调整大小有什么作用? 尝试使用它会比我解释的更好阅读的帮助。调整大小,调整范围。

以上是关于将单元格区域作为变量传递并使用函数复制数据的主要内容,如果未能解决你的问题,请参考以下文章

将 DataGridView 单元格 BackColor 传递给变量以供以后在 c# 中使用

Excel表中连接sql并使用sql语句引用excel单元格数据作为查询条件

EXCEL中OFFSET函数在合并单元格中怎么用?

使用 VBA 将单元格区域导出到新的 .csv 文件中并保存而不覆盖

excel vba 数组中第1位字符为0,赋给单元格时如何将0保留?

excel合并单元格怎么弄