【问题标题】:How to Use Excel Sheet as function?如何使用 Excel 工作表作为函数?
【发布时间】:2017-02-25 02:19:21
【问题描述】:

我正在尝试找到一种方法将一个 Excel 工作表用作函数。

我的文件中的工作表上有一个宏,我想在另一个工作表中插入宏的结果,以便在第一个工作表中进行多种输入组合。

正如这个非常古老的问题所建议的那样:Excel: using a worksheet as a function?,我正在尝试使用 Excel VBA,通过在我的工作表上做同样的事情,但我收到了一个“#VALUE”错误,这可能是什么?

这是代码

Function TEXTURE(sand, clay)
Sheets("Texture Calculator").Range("B4").Value = sand
Sheets("Texture Calculator").Range("D4").Value = clay
TEXTURE = Sheets("Texture Calculator").Range("G4").Value
End Function

我是 VBA 新手,我只是想通过旧帖子的试用找到解决方案

最好的,朱利奥

【问题讨论】:

  • 在 VBA 中执行 ?TEXTURE(0.7,0.1) 效果很好...但是:像工作表函数 (UDF) 一样使用它会失败,因为 UDF 不能“做”某事。因此,更改单元格值或打开文件或其他任何内容都会导致函数出错。
  • 您不能使用 function,因为用户定义的函数 (UDFs) 无法修改工作表。有没有办法将工作表转换成 VBA?

标签: excel vba function macros


【解决方案1】:

不确定我是否完全理解您的问题,但听起来您想在宏中建立沙子、淤泥和粘土 % 的输入以及随后的土壤类型确定。

我将输入单元格的格式从“百分比”更改为“常规”并输入百分比,以便 20 为 20%,15 为 15%,等等。用于土壤基本分类的工作表上的不等式(“计算”)跟随土壤质地三角形在 if/elseif 语句中被硬编码。看看这是否有帮助:

Sub Test()
Dim i As Integer: Dim sand_percent As Long: Dim clay_percent As Long: 
Dim silt_percent As Long:
Dim usda_texture As Variant:

For i = 4 To 7
  With Sheets("Texture Calculator")
      sand_percent = Range("B" & i).Value
      clay_percent = Range("D" & i).Value
      silt_percent = Range("F" & i).Value

      usda_texture = Texture_Determination(sand_percent, clay_percent, silt_percent)
      Range("G" & i).Value = usda_texture
  End With
Next i

End Sub

Function Texture_Determination(Sand As Long, Clay As Long, Silt As Long) As Variant

If Sand + Clay + Silt <> 100 Then
   MsgBox "Please ensure your inputs add up to 100%"
   Exit Function
End If

   'Determine the kind of soil texture using if/elseifs

If (Silt + 1.5 * Clay) < 15 Then
   soil = "Sand"
ElseIf Silt + 1.5 * Clay >= 15 And (Silt + 2 * Clay < 30) Then
   soil = "Loamy Sand"
ElseIf ((Clay >= 7 And Clay < 20) And (Sand > 52) And ((Silt + 2 * Clay) >= 30) Or (Clay < 7 And Silt < 50 And (Silt + 2 * Clay) >= 30)) Then
   soil = "Sandy Loam"
ElseIf ((Clay >= 7 And Clay < 27) And (Silt >= 28 And Silt < 50) And (Sand <= 52)) Then
   soil = "Loam"
ElseIf ((Silt >= 50 And (Clay >= 12 And Clay < 27)) Or ((Silt >= 50 And Silt < 80) And Clay < 12)) Then
   soil = "Silt"
ElseIf ((Clay >= 20 And Clay < 35) And (Silt < 28) And (Sand > 45)) Then
   soil = "Sandy Clay Loam"
ElseIf ((Clay >= 27 And Clay < 40) And (Sand > 20 And Sand <= 45)) Then
   soil = "Clay Loam"
ElseIf ((Clay >= 27 And Clay < 40) And (Sand <= 20)) Then
   soil = "Silty Clay Loam"
ElseIf (Clay >= 35 And Sand > 45) Then
   soil = "Sandy Clay"
ElseIf (Clay >= 40 And Silt >= 40) Then
   soil = "Silty Clay"
ElseIf (Clay >= 40 And Sand <= 45 And Silt < 40) Then
   soil = "Clay"
Else
soil = "Could not determine soil texture"
End If

Texture_Determination = soil

End Function

【讨论】:

  • 我已经尝试用你的代码的最后一部分编写一个函数,它工作得很好。正如我告诉你的那样,我是 excel VBA 的新手,但这似乎确实是最好的解决方案。实际上,我需要转换土壤类型中的淤泥、粘土和沙子的百分比。有了这个我不需要带有 MACRO 的表格
  • 很高兴它有帮助!
【解决方案2】:

正如您已经被告知的那样,UDF 不能改变环境。

但是有一些解决方法

例如

  • 改变你的功能如下:

    Function TEXTURE(sand, clay)
        TEXTURE = "Texture Calculator|" & sand & "|" & clay
    End Function
    
  • 将以下代码放在要使用 TEXTURE() UDT 的工作表代码窗格中:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If InStr(Target.Value, "Texture Calculator|") > 0 Then
            Application.EnableEvents = False
            With Worksheets("Texture Calculator")
                .Range("B4").Value = Split(Target.Value, "|")(1)
                .Range("D4").Value = Split(Target.Value, "|")(2)
                Target.Value = .Range("G4").Value
            End With
            Application.EnableEvents = True
        End If
    End Sub
    

这将在您输入=TEXTURE(number1,numnber2)时将原始TEXTURE() 函数的结果留在单元格中

【讨论】:

  • 这行得通,但 Excel 似乎没有在公式栏中保留 TEXTURE() 函数,而是直接绘制 CLAY。此外,如果我尝试拖放它会返回运行类型错误(13 类型不匹配)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多