【问题标题】:VBA function not referring to correct sheetVBA函数没有引用正确的工作表
【发布时间】:2014-04-24 11:31:51
【问题描述】:

我正在用 VBA 制作数据解析器,以便在另一个程序中输出图表。我制作了这个 vba 代码,它没有指正确的范围。

函数如下:

Function HCAlt(Rng1 As Range, Rng2 As Range, Rng3 As Range, Rng4 As Range) As String
' this function will take columns of data and properly format them for highcharts scatter pairs
Dim retVal As String
Dim i As Integer
Dim startRow As Integer
startRow = Rng1.Row

'if ranges doesn't contains one column and same rows count - return #VALUE error
If Rng1.Rows.count <> Rng2.Rows.count Or _
    Rng1.Columns.count <> 1 Or Rng2.Columns.count <> 1 Or Rng3.Rows.count <> Rng2.Rows.count Then
    HCAlt = CVErr(xlErrValue)
    Exit Function
End If

For i = 0 To Rng1.Rows.count - 1
    retVal = retVal & "{x:" & Rng3.Cells(startRow + i, 1) & ",y:" & Rng4.Cells(startRow + i, 1) & ",samp:'" & Rng1.Cells(startRow + i, 1) & "'" & ",Rock:'" & Rng2.Cells(startRow + i, 1) & "'},"
Next i
'remove last comma
If retVal <> "" Then retVal = Left(retVal, Len(retVal) - 1)

HCAlt = "[" & retVal & "]"
End Function

调用函数的单元格是这样的代码:

 HCAlt(INDIRECT(M$47),INDIRECT(M46),INDIRECT(M65),INDIRECT(M61))

它所指的单元格是范围:

 Cell M46= PlotData!R55:R141  'this is a range on sheet "PlotData"
 Cell M47= PlotData!A55:A141  'this is a range on sheet "PlotData"
 Cell M61= StData!L55:L141    'this is a range on sheet "StData"
 Cell M65= StData!P55:P141    'this is a range on sheet "StData"

该功能“有效”,但它不是指我想要它的单元格(它给我返回垃圾数据)。

我需要声明它所指的工作表吗?还是间接端口中的范围值告诉函数要找到哪个表?

谢谢

【问题讨论】:

  • 我在 Excel 中遇到了一些使用 R1C1 表示法效果更好的方法。我无法具体评论您的代码,因为我没有尝试过。您可以尝试检查函数中的范围地址是否与您传递给函数的地址匹配。
  • 一切似乎都很好。如果这些表存在,则它们被正确引用。尝试设置断点并查看交互式调试中的值。
  • 我怎样才能看到它在看哪张纸。当我运行断点时,我得到的数据不匹配。
  • Rng1-Rng4 添加手表,也许还有其他一些变量。我很难说出哪里出了问题,因为我不知道你期望这个函数返回什么以及它实际返回什么。
  • 这里有一些东西可以帮助解释这个问题。我可以看到,当我的范围是从 55 到 141 时,我从第 109 行而不是第 55 行获取数据。

标签: function vba excel


【解决方案1】:

这是我的问题。我认为我需要在范围开始的行上“开始”。在我的示例中为 55,因此我创建了一个变量来获取该行,然后将其添加到单元格行。

Dim startRow As Integer
startRow = Rng1.Row

Rng3.Cells(startRow + i, 1) '  this is part of the code where I added this starting row- see above'

我删除了起始行变量并改用它:

Rng3.Cells(i, 1)

由于我的数据指的是相同数据的“重复”表格,但这些表格的排序方式不同,因此我可以更改我所指的单元格,使它们都在同一张工作表上。

Cell M46= StData!R55:R141  'this is a range on sheet "StData"
Cell M47= StData!A55:A141  'this is a range on sheet "StData"
Cell M61= StData!L55:L141  'this is a range on sheet "StData"
Cell M65= StData!P55:P141  'this is a range on sheet "StData"

这解决了正确的值。我不确定最后一部分是否有任何不同,但我会谨慎行事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2017-11-22
    • 2011-09-25
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多