【问题标题】:VBA issue : Simple operations with multiple types of variablesVBA问题:具有多种类型变量的简单操作
【发布时间】:2016-05-31 14:36:42
【问题描述】:

我在 Excel 2010 中使用 VBA 函数处理不同类型的变量时遇到了一个非常烦人的问题。由于有关相同溢出问题(错误 6)的其他一些问题,我已经尝试使用没有 Excel 转换的广告的以下代码,但它没有解决(我可能做错了,但我不再有我的说明了)

Function do_calculation(lig_desti As Integer, col_desti As Integer)
  Range(Cells(lig_desti, col_desti), Cells(lig_desti, col_desti)).Value = Range(Cells(lig_desti, col_desti - 3), Cells(lig_desti, col_desti - 3)).Value * (Range(Cells(lig_desti, col_desti - 1), Cells(lig_desti, col_desti - 1)).Value / Range(Cells(lig_desti, col_desti - 2), Cells(lig_desti, col_desti - 2)).Value)
End Function

总结一下,我想做(对于每一行)D = A * (C / B)。

这个想法是我有 3 列值,这里是第一行只是为了给你一个想法:

A        B      C         D
2187    71,8    18
1050    78,65   18
1813    92,35   18
2379,45 94      18

所以基本上(除非我错了)我必须处理长整数、双精度数和整数。请注意,“C”列将始终包含相同的值 (18),而 A 列可能包含大于 20k 或 30k 的大整数

提前感谢您的帮助

【问题讨论】:

  • 如果B列有小数,则不能使用integer
  • 我是吗?在谈到整数时,我主要指的是“C”列
  • 给定的代码必须作为宏的一部分运行;禁止作为工作表函数调用的一部分运行的代码更改工作表,因此 Range(x,y).Value=2 将失败。
  • 另外,如果是C/B,为什么最后一个/18??
  • 你不需要 Range(cells(x,y), cell(x,y)) 只需使用 Cells(x,y)。这是一个单细胞,不是吗?

标签: vba excel long-integer multiplication


【解决方案1】:

不妨试试这个

Sub WriteFormula(ByVal sh As Excel.Worksheet, ByVal lRow As Long, ByVal lColumn As Long)
    Dim rng As Excel.Range
    Set rng = sh.Cells(lRow, lColumn)

    rng.FormulaR1C1 = "=RC[-3]*(RC[-1]/RC[-2])"
End Sub

Sub Test()
    WriteFormula ActiveSheet, 1, 4
End Sub

【讨论】:

  • 谢谢,我会考虑你的做法
【解决方案2】:

要以简单的方式执行此操作,您可以使用Application.Caller。要做到这一点,它也可以用作数组,只需使用Evaluate

把它放到一个**Module*中:

Public Function do_calculation() As Variant
  With Application.Caller '.Cells '(1, 1)
    do_calculation = Evaluate(.Offset(, -3).Address & "*" & .Offset(, -1).Address & "/" & .Offset(, -2).Address)
  End With
End Function

然后在 D1 中输入 =do_calculation() 并复制下来。或者选择范围 D1:D4 并输入 =do_calculation() 但使用 ctrl+shift+enter 确认。

要直接获取值,您需要通过Sub 来完成,如下所示:

Sub do_calculation(rng As Range)
  With rng
    .Value = Evaluate(.Offset(, -3).Address & "*" & .Offset(, -1).Address & "/" & .Offset(, -2).Address)
  End With
End Sub

只需选择单元格 D1:D4 并运行 do_calculation selection

【讨论】:

  • 这真的帮了我大忙!非常感谢
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2023-03-08
  • 2023-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多