gpt4 book ai didi

VBA错误的数字参数用户表单代码,传输变量?

转载 作者:行者123 更新时间:2023-12-04 22:31:05 25 4
gpt4 key购买 nike

尝试创建一个预算电子表格,其中从 csv 文件中读取支出,我将其分配给类别(通过用户表单),并且对于这一点,传入的资金有一个单独的用户表单,我可以在文本中放置简短描述然后将其记录在输出表中的值旁边。
使用此站点负载来解决所有问题 - 但卡在这里。
宏运行良好,但在用户表单代码中出现“参数数量错误或属性分配无效”并突出显示 expend.Caption 行中的 indescript(x) 位。
原始子是

Public x, xmax As Integer
Public incmng(1 To 100) As Variant
Public incdescript(1 To 100), inctot As String

' add in the incoming payments with user entered short description
inctot = ""
For x = 1 To xmax
indes.Show
inctot = incdescript(x) & "; " & inctot
Cells(r - 2, 7) = inctot
Next x
用户表单(名为 indes)的代码是
Private Sub UserForm_Initialize()
' Load the expenditure details
expend.Caption = incdescript(x) & ": " & incmng(x)
incans.Value = "change me :-)"
End Sub

Private Sub OKButton_Click()
' Allow user to put in a short description
incdescript(x) = incmng(x) & " " & incans.Text
Unload Me
End Sub
Private Sub CancelButton_Click()
Unload Me
End
End Sub
几乎就好像它无法在 subs 之间传输“x”的值,因为前者在 watch 中显示为 value = 1,在用户表单代码中显示为无法编译。
感谢您的任何建议!

最佳答案

即使这确实有效,您也不想使用这样的变量。应该给它们尽可能窄的范围,以避免您忘记(或维护您的代码的其他人忘记)它们是全局声明的。

正如评论中提到的那样,用逗号分隔的声明......

Public x, xmax As Integer

...仅对具有 As {Type} 的那些进行强类型化在他们之后。在这种情况下, xmaxInteger , 和 x是隐含的 Variant因为没有声明类型。

UserForms 是 VBA 中的类,作为类,它们可以使用公共(public)方法和属性进行扩展。问题是您使用的是表单的默认实例,而不是在循环中创建新实例。当您调用 Unload从表单内部,您只需这样做,所有信息都会丢失。

解决方案是显式创建表单的实例。这样,您可以使用自定义初始化程序或属性配置它们,并轻松地从调用者来回传递信息。表单代码如下所示:
'indes
Option Explicit

Private incdescript As String
Private incmg As String
Private userEntry

Public Sub LoadValues(descript As String, incoming As String)
expend.Caption = descript & ": " & incoming
incdescript = descript
incmg = incoming
End Sub

Public Property Get UserDescription() As String
UserDescription = incdescript = incmg & " " & incans.Text
End Property

Private Sub OKButton_Click()
Me.Hide
End Sub

需要注意的几件事 - 这种形式中没有任何东西依赖于全局变量。所有配置都是通过将参数传递给 LoadValues 来处理的。过程,并且“返回值”通过自定义 UserDescription 公开属性(property)。

另外,请注意确定按钮不 Unload表格。这很重要,因为您将使用它来将信息传递回调用者。

调用代码看起来更像这样:
Dim x As Integer, xmax As Integer
Dim incmng(1 To 100) As Variant
Dim incdescript(1 To 100) As String, inctot As String

' add in the incoming payments with user entered short description
inctot = ""
Dim paymentDialog As indes
For x = 1 To xmax
Set paymentDialog = New indes
paymentDialog.LoadValues incdescript(x), incmng(x)
paymentDialog.Show vbModal
inctot = paymentDialog.UserDescription & "; " & inctot
Unload paymentDialog
Cells(r - 2, 7) = inctot
Next x

您创建表单的一个新实例,在显示之前将表单需要的值传递给它。当表单调用 Me.Hide ,控制权传递回调用过程,然后您向表单询问用户输入的内容。然后 调用程序卸载它。

请注意,这只是我认为处理 UserForm 的“最佳实践”的粗略草图。 .有关更详细的描述,我会查看 this answer @MathieuGuindon 并阅读他的博客文章 here .

关于VBA错误的数字参数用户表单代码,传输变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52674659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com