【问题标题】:Auto Generate Excel Table Using VBA使用 VBA 自动生成 Excel 表格
【发布时间】:2014-01-13 22:35:21
【问题描述】:

我应该先说明我没有使用 Excel 的任何高级功能的经验,现在我需要使用它们,我不知道我在做什么。

我需要生成一个包含以下列的 excel 表:每列中的 ID、名字、姓氏、密码和电话。我需要在每列中输入 N 个条目,其中 ID、名字和姓氏只是随机字符,最多 X 个字符,密码是随机大写、小写和字母数字字符,最多 Y 个字符,电话是随机的 10 位数字诠释。我可以很容易地生成随机字符串,它会检查以确保内容对于表中已经存在的任何其他内容都是唯一的,并添加我不知道的内容。我在 Mac 上,所以这也可以在 bash 中完成,创建一个 csv 文件,这是另一个我知之甚少的领域,但我想,因为它是 Excel 特定的,我需要类似的技能,我应该开始学习 VBA。

【问题讨论】:

  • 请向我们展示您到目前为止所做的步骤。对于初学者,请尝试录制宏并向我们展示并准确地向我们解释您所做的事情。 :)
  • 我知道这是这里的常态,但在这种情况下,我真的没有什么可做的。

标签: vba excel excel-2011


【解决方案1】:

如果我理解正确,您会担心 ID,例如,您在第 N 行生成的 ID 与您为 2 到 N-1 范围内的行之一生成的 ID 相同。

我不知道有一个 VBA 函数会报告某个值是否匹配范围内的任何值。当我使用 PC 时,您使用的是 MAC,但我怀疑这会有所不同。

您寻找一个五列的表。你必须记住很多行,比如 Max。您希望第 1 行保留标题行。你说你知道如何为每一列生成随机值。

我知道 MAC 和 PC VBA 之间存在细微差别,但我认为以下是常见的。

我会在数组中生成表格,这比访问工作表单元格要快得多。

Dim Rng as Range
Dim WkshtValue as Variant

With Worksheets("xxxx")
  Set Rng = range of interest
  WkshtValue = .Rng.Value
End With

上面的代码会将 WkshtValue 转换为所需大小的数组,并将感兴趣范围内的所有值复制到其中。因为 WkshtValue 是 Variant,所以数组中的条目将是字符串、整数、日期或它们在工作表中的任何内容。

无论范围在工作表中的位置如何,此数组都将是基于一的,因此如果范围是基于一的,它对我的​​大脑的伤害较小。

WkshtValue 的第一个维度用于行,第二个维度用于列。这不是正常的约定,但它意味着 WkshtValue(Row, Col) 匹配 .Cells(Row, Col).Value

做相反的事情稍微困难一些,但你可以定义一个数组,用值填充它,然后将 is 写入工作表:

Dim Rng as Range
Dim WkshtValue() as Variant

ReDim WkshtValue(1 To Max + 1, 1 To 5)

' Fill row 1 - WkshtValue(1, 1) to WkshtValue(1, 5) - with the header row values.
' Fill rows 2 to Max+1 with appropriate randon values.

With Worksheets("xxxx")
  Set Rng = .Range(.Cells(1, 1), .Cells(Max + 1, 5))
End With
Rng.Value = WkshtValue

我将编写一个函数 RanVal(ColCrnt) As String,它返回一个适合列 ColCrnt 的随机值。

然后我会有类似的东西:

For RowCrnt = 2 to Max + 1
  For ColCrnt = 1 To 5
    Do While True
      ValPoss = RanVal(ColCrnt)
      MatchFound = False
      For RowTemp = 2 to RowCrnt - 1
        If WkshtValue(RowTemp, ColCrnt) = ValPoss Then
          MatchFound = True
          Exit For
        End If
      Next
      If Not MatchFound Then
        Exit Do
      End If
    Loop
    WkshtValue(RowCrnt, ColCrnt) = ValPoss  
  Next
Next

上面的代码是直接输入到答案中的,没有经过测试。我看不到任何语法错误,但没有任何承诺。如果我犯了你无法纠正的错误,请回来。

希望这能给你一些想法。

【讨论】:

  • 这正是我想要的。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多