如何将 Variant 数组转换为 Range?

2023-12-27

我有一个 2D 数组类型Variant。填充数组的大小和值是根据工作表中的数据生成的。该数组需要进一步处理,主要是几个值的插值。我正在用这个插值函数 http://www.ozgrid.com/forum/showthread.php?t=64100(我知道 Excel 等效函数,但设计选择不使用它们)。我遇到的问题是 Interpolation 函数需要 Range 对象。

我已经尝试修改函数以使用变体(r as Variant) 争论。下面一行nR = r.Rows.Count可以替换为nR = Ubound(r)。虽然这有效,但我也想在任何工作表中正常使用此函数,并且不以任何方式更改该函数。

Sub DTOP()
    Dim term_ref() As Variant
    ' snip '
    ReDim term_ref(1 To zeroRange.count, 1 To 2)

    ' values added to term_ref '

    ' need to interpolate x1 for calculated y1 '
    x1 = Common.Linterp(term_ref, y1) 
End Sub

插值函数

Function Linterp(r As Range, x As Double) As Double
    Dim lR As Long, l1 As Long, l2 As Long
    Dim nR As Long

    nR = r.Rows.Count
    ' snipped for brevity ' 
End Function

如何将内存中的变体数组转换为 Range 以便将其用于插值函数? (不输出到工作表)

Answer

简而言之,答案是你不能。 Range 对象必须引用工作表。

更改后的插值函数检查TypeName的参数并设置值nR因此。不是最漂亮的解决方案。

作为注释,VarType事实证明,函数在这种情况下毫无用处,因为VarType(Variant()) and VarType(Range)返回相同的值(即 vbArray)并且无法用于消除数组与范围的歧义

Function Linterp(r As Variant, x As Variant) As Double
    Dim lR As Long, l1 As Long, l2 As Long
    Dim nR As Long

    Dim inputType As String
    inputType = TypeName(r)

    ' Update based on comment from jtolle      
    If TypeOf r Is Range Then
        nR = r.Rows.Count
    Else
        nR = UBound(r) - LBound(r) 'r.Rows.Count
    End If
    ' ....
 End Function 

AFAIK,您无法创建不以某种方式引用工作簿的工作表位置的 Range 对象。它可以是动态的,例如 Named =OFFSET() 函数,但它必须与某处的工作表相关联。

为什么不改变插值函数呢?保持 Linterp 签名不变,但将其放入在数组上插值的函数的包装器中。

像这样的事情:

Function Linterp(rng As Range, x As Double) As Double
' R is a two-column range containing known x, known y
' This is now just a wrapper function, extracting the range values into a variant
    Linterp = ArrayInterp(rng.Value, x)

End Function

Function ArrayInterp(r As Variant, x As Double) As Double

Dim lR As Long
Dim l1 As Long, l2 As Long
Dim nR As Long

    nR = UBound(r) ' assumes arrays are all 1-based

    If nR = 1 Then
        ' code as given would return 0, better would be to either return
        ' the only y-value we have (assuming it applies for all x values)
        ' or perhaps to raise an error.
        ArrayInterp = r(1, 2)
        Exit Function
    End If

    If x < r(1, 1) Then ' x < xmin, extrapolate'
        l1 = 1
        l2 = 2
    ElseIf x > r(nR, 2) Then ' x > xmax, extrapolate'
        l2 = nR
        l1 = l2 - 1
    Else
        ' a binary search might be better here if the arrays are large'
        For lR = 1 To nR
            If r(lR, 1) = x Then ' no need to interpolate if x is a point in the array'
                ArrayInterp = r(lR, 2)
                Exit Function
            ElseIf r(lR, 2) > x Then ' x is between tabulated values, interpolate'
                l2 = lR
                l1 = lR - 1
                Exit For
            End If
        Next
    End If

    ArrayInterp = r(l1, 2) _
           + (r(l2, 2) - r(l1, 2)) _
           * (x - r(l1, 1)) _
           / (r(l2, 1) - r(l1, 1))

End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 Variant 数组转换为 Range? 的相关文章

  • Excel VBA 自动过滤子字符串

    我的 Excel 中有多行 其中 D 列为 TDM 02 Bundle Rehoming 5 NE TDM 02 Bundle Rehoming 23 NE IP 02 Bundle Rehoming 7 NE 等 请注意 大多数情况下 N
  • 父子进程隔离和子进程列表

    请阅读以下模板 PID Status LPID 10 Closed 25 11 Open 25 31 Open 31 25 Closed 25 54 Open 31 17 Open 17 20 Closed 31 88 closed 77
  • 重新查询时如何避免转到第一条记录?

    在 Access 2010 中制作一个表单 我试图制作一个移动到下一条记录 如果在末尾则为第一个记录 的按钮 但因为我想考虑其他用户对已发生的数据集的更新与此同时 我在转到下一条记录之前重新查询表单 我正在使用以下代码 改编自这个帖子 ht
  • Excel VBA 日期格式

    我有一个包含多个日期的电子表格 这些通常出现在mm dd yyyy or mm dd yyyy hh mm 问题是日期并不总是正确输入 我想进行检查以确保它们是代码中的日期 我最初的想法是使用IsDate检查或CDate但这似乎不起作用 它
  • 在 Excel VBA 中,如何保存/恢复用户定义的过滤器?

    如何使用 VBA 保存并重新应用当前过滤器 在 Excel 2007 VBA 中 我试图 保存用户在当前工作表上拥有的任何过滤器 清除过滤器 做东西 重新应用保存的过滤器 看一下捕获自动筛选状态 http www mrexcel com f
  • excel vba范围单元格错误对象定义[重复]

    这个问题在这里已经有答案了 我一直在 Excel 中开发一个宏 该宏对一张工作表 次要 中的表格进行排序 当满足条件时 它应该将该表中的数据添加到第二张工作表 Sheet1 中的另一个表格中 但是我一直运行时出现 1004 错误 对象未定义
  • VBA Excel - 如何在 Excel 数组中显示不相等的值

    所以目前我在Excel中有两个数据输入 数据1和数据2 我需要一个公式或某种形式来显示结果 目前这是一个手动过程 使用方法Filter 功能 Function test ByVal a ByVal b Optional Delim As S
  • 如何正确编写 CSS 属性选择器来提取所有 id 属性?

    情况 我目前正在尝试在 VBA 中使用语法重现属性选择器 attr 来自给出的 CSS 选择器练习here https www w3schools com cssref trysel asp 选择器旨在根据给定属性的值选择元素 预期结果 在
  • 有没有办法加快此 VBA 宏的运行速度,以在大范围内执行 1000 次 Vlookup?

    Sub Questionnaire to Ventilation Questionnaire to Ventilation Macro Keyboard Shortcut Ctrl Shift M Application ScreenUpd
  • 选择或复制三个不相邻的单元格 3

    如何使用复制 3 个不相邻的单元格ActiveCell Row Range A ActiveCell Row C ActiveCell Row E ActiveCell Row Copy Update 欲了解更多信息 请遵循 https y
  • 在 Windows 服务中使用 OleDb 从 Excel 读取数据?

    免责声明 我知道这是一种不好的做事方式 这是我们与客户的唯一选择 Problem 我们需要每隔 x 时间从 Excel 文件读取数据 数据通过第三方 Excel 插件不断变化 应用程序的环境是 Windows XP SP1 和 Net 2
  • VBA 6:正则表达式无法识别复杂的字符串

    我有这个字符串 1X214X942 0SX 其中每个 X 代表一个 不间断空格 准确地说是空白 ASCII 代码为 160 S 代表一个空格字符 我试图用这个正则表达式来识别它 d 1 3 s d 3 s d 3 d 1 3 d 1 3 d
  • VBA:或操作员不执行[重复]

    这个问题在这里已经有答案了 我试图在 VBA 中使用 OR 运算符 但编译时出现错误 我已经在线检查了语法 并且我确信我使用正确 例如 如果我做这样的事情 If CStr Worksheets MINUTES Cells x 2 A1 2
  • Excel幂查询——聚合连续“传递”重叠时间间隔

    我正在尝试使用 Excel 强力查询将下面给出的表 1 聚合到表 2 目标是将同一组的连续时间间隔合并到一行中 对于像事件 5 和事件 6 这样的直接重叠 这非常容易 但这种方法仅合并事件 1 和 2 以及 2 和 3 从而产生两个条目 参
  • Apache POI:包含图表的克隆工作表

    根据众多消息来源 例如官方页面上的限制部分 http poi apache org spreadsheet limitations html 可能从 POI 处理 Excel 图表的唯一好方法是使用 Excel 文件和现有图表作为模板 并修
  • VBA - Countif Range 与数组中的至少一个值匹配

    我不知道如何完成这项任务 如果该范围内的单元格中至少有一个单词与数组匹配 我需要计算工作表中的范围 例如 如果细胞 B2 有一个句子 其中包含数组中的单词之一 然后算作 1 然后简单地countif如果与数组匹配 则为范围 我的代码会更好地
  • R:读取多个Excel文件,提取第一个工作表名称,并创建新列

    我有多个 Excel 文件 并且它们具有唯一的工作表名称 在我的情况下是文件创建日期 我批量阅读它们 需要将工作表名称分配给新列 id 中的每个文件 我知道如何制作数字 id 或 id 文件名 但找不到将工作表名称获取为 id 的方法 li
  • 尝试打开 Excel 时出现“KeyError:“存档中没有名为“xl/sharedStrings.xml”的项目”

    我正在尝试使用 Python 脚本将数据导入 PowerBi 以便我可以安排它定期刷新数据 我面临着从 Excel 文件获取数据并收到错误的挑战 KeyError 没有名为 xl sharedStrings xml 的项目在档案中 导入时
  • 在 C# 中生成 Excel 列字母的最快函数

    接受 int 并返回包含一个或多个字母的字符串以便在 Excel 函数中使用的最快 C 函数是什么 例如 1 返回 A 26 返回 Z 27 返回 AA 等 这被调用了数万次 并且占用了生成包含许多公式的大型电子表格所需时间的 25 pub
  • 从 VBA 打开工作簿并禁用 Workbook_Open() 代码?

    我正在使用 VBA 打开电子表格 并且一些工作簿包含在调用 Workbook Open 时开始执行的代码 如何使用 VBA 打开工作簿但停止代码自动执行 我只是打开工作簿来查看工作表中的公式 我不想执行任何代码 你想试一下吗禁用在 VBA

随机推荐

  • 如何可视化二进制/分类数据随时间的变化?

    gt dput data structure list ID c 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 Dx c 1 1 1 1 1 1 1 2 2 2 1 1 1 1 1 Month c 0 6 12 18 24 0
  • 用 C 读取文本文件,将行分成多个变量

    我目前正在开发一个模拟各种CPU调度方法的程序 目前我有一个要求输入的程序 printf Enter type of CPU scheduling algorithm SJF RR PR noPREMP PR withPREMP scanf
  • 模拟 side_effect 迭代器用完后可以重置吗?

    mock reset mock 不会重置副作用迭代器 有没有办法在不再次创建模拟的情况下做到这一点 gt gt gt from mock import MagicMock gt gt gt mock MagicMock side effec
  • 如何从 numpy ndarray 中删除特定值

    我有一个 numpy ndarray 如下所示 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 225 224 228 163 164 174 205 212 229 116 130 153 81 101
  • 使用 Prolog 解决脑筋急转弯(Master Mind)

    一位工作中的朋友在我们的 Whatsapp 群组中分享了这一点 这把锁有一个 3 位数的代码 仅使用这些提示你能猜出来吗 我们使用类似于真值表的东西解决了这个问题 不过我很好奇 在 Prolog 中如何解决这个问题 直接编码check谓词
  • 如何将整个向量复制到队列中?

    我希望将向量的全部内容复制到 C 中的队列中 这是一个内置函数还是有必要循环每个元素 如果创建一个新队列 可以使用构造函数 std vector
  • AWS Aurora MySQL 无服务器:如何从 MySQL Workbench 进行连接

    我试图在我的项目中使用 AWS Aurora Serverless for MySQL 但我无法连接到它 尽管我有端点 用户名 密码 我做了什么 从 AWS 控制台管理中 我选择 RDS gt 实例 gt Aurora gt 无服务器 保留
  • C# 中使用 XmlReader 读取 Xml

    我试图尽可能快地读取以下 Xml 文档 并让其他类管理每个子块的读取
  • 就地修改字典值

    我想将函数应用于 a 的值dict位于dict like map在函数式编程设置中 假设我有这个dict d a 2 b 3 我想应用该功能divide by 2 0字典的所有值 导致 d a 1 b 1 5 最简单的方法是什么 I use
  • 自动引用 Microsoft.Data.Tools.Schema.Sql.UnitTesting

    以下引用将自动添加到我的 控制台应用程序 项目中 Microsoft Data Tools Schema Sql UnitTesting dll Microsoft Data Tools Components dll 我的老板无法在他的机器
  • 使用 VBA 编辑器创建 DLL

    我的职位是全职编写 Visual Basic 宏来支持公司的多个部门 我做得很好 学到了很多东西 也很喜欢我的职位 我们正在制定未来的计划 虽然我非常擅长搜索这些项目所需的信息 堆栈溢出是一个很好的资源 但我已经干了一些我已经做过的事情一直
  • 为什么注销后点击页面后退按钮会显示上一页内容?

    我正在开发一个 Struts 2 项目 当用户点击一个logout按钮logout使用操作清除会话session clear 但是当用户点击back注销后浏览器中的按钮 仍显示上一页内容 我想将用户重定向到登录页面 如果back注销后在浏览
  • Richfaces 列过滤器:如何在介绍键上触发事件

    我有一个rich extendedDataTable我正在使用列过滤 我希望一旦用户输入 intro 键就触发过滤器 但在javascript中没有这样的事件 我想这样做是因为如果我使用诸如onkeyup我收到了太多的请求 因此遇到了问题
  • ubuntu 11.10 中终端和浏览器中显示不同的 php 版本

    当我在终端显示中使用 php v 时 PHP 5 3 6 13ubuntu3 9 与 Suhosin Patch cli 构建时间 2012 年 9 月 12 日 19 02 11 版权所有 c 1997 2011 PHP 集团 Zend
  • 使用 mysql_free_result($result) 是一个好习惯吗?

    我知道所有关联的结果内存都会在脚本执行结束时自动释放 但是 如果我使用了很多如下类似的操作 您会建议使用它吗 sql select from products result mysql query sql if result mysql n
  • 为什么要在 python 中使用类方法? [复制]

    这个问题在这里已经有答案了 我正在 python 的某个类中编写一个函数 人们建议我向这个函数添加一个 classmethod装饰师 My code import random class Randomize RANDOM CHOICE a
  • 如何将表单数据从角度传递到nodejs

    我是 Angular5 的新手 我需要将用户详细信息从 Angular 传递到 Nodejs 应用程序组件 ts import Component from angular core import FormBuilder FormGroup
  • 删除 MultiIndex 中带有重复项的 NaN 行

    使用重现我的确切问题的 DataFrame 进行更新 我有一个问题NaN出现在我的索引中会导致非唯一的行 因为NaN NaN 我需要将所有行删除到NaN出现在索引中 我之前的问题有一个示例 DataFrame 其中包含一个NaN行 但是原始
  • Backbone.js 与 Eco 模板:如何在模板中包含模板?

    是否可以在模板中包含模板 也许类似于 ERB 处理部分的方式 与其尝试以 ERB 之类的方式渲染嵌套模型 不如让 Backbone js 来处理这个问题 注意 我使用的是 Coffeescript 语法 项目 IndexView templ
  • 如何将 Variant 数组转换为 Range?

    我有一个 2D 数组类型Variant 填充数组的大小和值是根据工作表中的数据生成的 该数组需要进一步处理 主要是几个值的插值 我正在用这个插值函数 http www ozgrid com forum showthread php t 64