【问题标题】:How to use UserForm Values for multiple things如何将用户表单值用于多种用途
【发布时间】:2015-03-16 20:51:22
【问题描述】:

我有 UserForm1,它是一个多页用户表单,我正在尝试访问通过位于 Module1 中的子表单中的表单收集的信息。这个 sub 需要访问几个不同的值并使用这些值做不同的事情,所以这将是一个多部分的问题。

  1. 我在下面的代码中尝试使用其中一个值作为 For Next 循环的上限。然而当前的问题是,当代码到达这一行时,它会跳转到 Userform_Initialize 例程。

For X = 1 To UserForm1.LocalOffer.Value
  1. 这个问题的第二部分来自上面的 For Next 循环。我有下面的代码。理想情况下,这将允许我从用户窗体中循环浏览一系列类似命名的文本框。甚至不确定这是否会起作用,因为在到达那部分之前代码会不断中断。

Range("B" & X).Value = UserForm1.Controls("LocalTier" & Tier).Value 
  1. 如果我在用户窗体中有一个文本框,其中包含格式为 1/18/2015 的日期,那么这个问题的最后一部分是否有办法让我只获取该日期的一部分,例如只是一天或只是年份的最后一位数字?

我使用的是 Excel 2013,但文件将在 Excel 2007 上运行

编辑: 事实证明,问题 1 是通过不使用 X 按钮关闭用户窗体,而是在您点击最后一个按钮时添加一行来隐藏用户窗体来解决的。事实证明,一旦我通过了第二个问题,我的代码就可以正常工作。剩下的唯一问题是最后一个我不知道的问题。

【问题讨论】:

  • 我使用按钮将它们显示为代码行,但如果有人可以编辑,我将不胜感激。
  • 这是因为它所在的列表。不优雅,但我放了水平线来解决这个问题。可能还有其他方法, 块也可以工作
  • 那么,让我们从头开始:当代码到达这一行时,UserForm1.LocalOffer.Value 的值是多少?我想它是 1,所以代码会立即跳过这个 For Next 结构。请检查一下。
  • LocalOffer的值为4,Tier的值为9,LocalTier9的值为50
  • 当用 X 关闭用户窗体时,用户窗体的值会消失吗?

标签: vba excel excel-2007 excel-2013 userform


【解决方案1】:

从 cmets 看来,我认为您不再需要了解第 1 点和第 2 点,因此我将回答限制在第 3 点。

这个问题的最后一部分,如果我在用户表单中有一个包含格式为 2015 年 1 月 18 日的日期的文本框,有没有办法让我只获取该日期的一部分,例如一天还是一年的最后一位数字?

您可以使用字符串操作或日期转换。 假设文本框名为myDateTextbox

字符串操作

在 VBA 提供的字符串操纵器中,我会引用 Left()Right()

例如:

last_digit_of_the_year = Right(myDateTextbox.Text, 1)

将返回字符串的最后一个字符。另一方面:

first_digit = Left(myDateTextBox.Text,1)

将返回字符串的第一个数字。 您可以使用内置的Len(myDateTextBox.Text) 返回字符串的当前长度。

日期转换

您可以使用CDate() 函数简单地将字符串转换为日期。请注意,如果您传递无效字符串,此函数将返回错误。如果您的文本框包含24/01/1990,您可以先将字符串转换为日期:

myDate = CDate(myDateTextBox.Text)

因此,您可以像这样检索日、月或年:

myYear = Year(myDate)
myMonth = Month(myDate)
myDay = Day(myDate)

请注意,CDate 根据您系统的区域设置识别日期格式。。因此,如果 TextBox 中的格式与您的系统中的格式不同,请考虑操作字符串 before 以使其适应正确的格式。例如,如果您的系统有设置 DD/MM/YYYY 并且您的文本框显示 MM/DD/YYYY 类型,您可以“调整”如下:

wrongFormat = myDateTextBox.Text
splittedDate = Split(wrongFormat,"/")
goodFormat = splittedDate(1) & "/" & splittedDate(0) & "/" splittedDate(2)

如果wrongFormat1/18/2014,但您的系统想将其读取为18/1/2014,现在可以了,因为在拆分和重新构建后goodFormat 将等于18/1/2014

【讨论】:

  • 注意:我建议使用第二种方法,即日期转换,因为您可以享受内置函数的稳定性,用于日期操作,而使用字符串操作,您总是面临更多输出质量的风险.
  • 这个答案是如此深入和精彩,我不能感谢你。有了这个,我应该能够完成我已经连续工作了 13 个小时的项目。准备好完成这项工作了。
  • 我在即时窗口中测试 Day() 转换,看看它是否会将本月的 1 日转换为 1 或 01,我有一个问题。我输入 Msgbox Day(1/1/2015),它返回一个 msgbox,上面写着 30。我将日期更改为 1/5/2015,它仍然返回 30。将其更改为 2/5/2015,仍然返回 30 .
  • @ChadPortman,你不能这样写日期。将日期写入 VBA 代码的正确方法是将它们放在两个主题标签之间。试试这个,它会正常工作:MsgBox Day(#1/1/2015#),或MsgBox(#1/5/2015#)
  • 附言。更准确地说,写1/1/2015 没有主题标签就像写one divided by one divided by 2015,它接近于0。作为系统日历的第一个日期(即1900 年1 月1 日)1,你的“几乎为0”将被解释为 1899 年 12 月 30 日。这就是为什么您将 30 视为当天的输出(这只是为了学习目的,请记住:VBA 代码中的日期总是在两个 # 之间);)
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多