当前位置: 首页 > 知识库问答 >
问题:

在VBA/Excel中将列标题转换为组合框的列表项

陈斌
2023-03-14

我有一个用户表单上的组合框,我想用一个值列表填充它。

这些值位于一系列列的中间,可以被认为是列标题,因为每个列都在自己的列中。列的列表会随着时间的推移而扩展,每次初始化用户表单时都应该更新。我已经能够从单个列创建列表,也可以从多个列创建列表,但是当我这样做时,值保持在列方向,我无法将它们转置到行列表中。列中的数据如下所示:

|--|--A--+--B--+--C--+--D--+ ... +
|--|-----+-----+-----+-----+
|1 |     |     |     |     |
|--|-----+-----+-----+-----+
|2 |  << other data here >>|        
|--|     +-----+-----+-----+
|3 |  "  |  a  |  b  |  c  | ...    <~~ row 3 data (needed as 2nd element in combobox)
|--|     +-----+-----+-----+
|4 |  "  |  d  |  e  |  f  | ...    <~~ row 4 data (needed as 1st element in combobox)
|--|     +-----+-----+-----+
|5 |  "  |  1  |  2  |  3  |
|--|     +-----+-----+-----+
|6 |  "  |  4  |  5  |  6  |
|--|-----+-----+-----+-----+
|7 |  "  |  7  |  8  |  9  |
|--|-----+-----+-----+-----+

我希望组合框列表条目如下所示:

d   a
e   b
f   c

这个用户表单由另一个用户表单初始化,该用户表单从几个选项中选择,然后从几个具有相似信息的工作表中激活正确的工作表。当第二个用户表单初始化时,它应该用上面例子中的数据填充combobox。我用下面的代码从一列中创建了一个值列表:

Private Sub UserForm_Initialize()

    'ReferenceCombo.ColumnCount = 2
    'Range("B4", Range("B" & Rows.Count).End(xlUp)).Name = "Dynamic"
    'Me.ReferenceCombo.RowSource = "Dynamic"

End Sub

我还可以使用以下命令获取一行中所有值的列表:

Dim sht As Worksheet
Set sht = ActiveSheet

    ReferenceCombo.ColumnCount = 2
    sht.Range(Sheet7.Cells(4, 2), Sheet7.Cells(4, Columns.Count).End(xlToLeft)).Name = "Dynamic"
    sht.Range(Sheet7.Cells(4, 2), Sheet7.Cells(4, Columns.Count).End(xlToLeft)).Select
    Me.ReferenceCombo.RowSource = "Dynamic"

但这只选择了我想要的两行中的一行,并没有将值列表转换为正确的格式。

我从这里尝试过信息,但这似乎不适用于用户表单。这里的信息有助于正确选择行。这有助于选择动态字段。在这里,我找到了关于转置列表的信息,但我不确定我是否完全理解。这与列表填充范围有关,但我不确定这是否适用于用户表单上的组合框。这与插入转置函数有关,但对我不起作用。

任何帮助都将不胜感激。

共有1个答案

穆承运
2023-03-14

将第 4 行和第 3 行中的标题信息分配给组合框

据我了解您的帖子,您希望提取从单元格 B3 到第 4 行最后一列的标题信息,但在组合框中以相反的行顺序显示数据。

您可以将这些数据分配给一个可变的二维数组,并使用<code>应用程序的高级可能性对其进行重构。索引function*)并将数组分配给组合框。一行中的列属性(为了避免通过常用的.Listproperty进行进一步的重传)。

*)请参见<code>应用程序的高级可能性。索引函数

Option Explicit                     ' declaration head of Userform code module

Private Sub UserForm_Initialize()
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' [1] assign data to variant 1-based 2-dim array v
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Dim v As Variant, nCols As Long
  nCols = Sheet7.Range(Sheet7.Cells(4, 2), Sheet7.Cells(4, Columns.Count).End(xlToLeft)).Columns.Count
  v = Sheet7.Range("B1").Resize(4, nCols).Value2          ' e.g. B1:X4 (if X4 is last column)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' [2] restructure array by filtering rows 4,3 and all columns Array(1,2,3,...)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  v = Application.Index(v, Application.Transpose(Array(4, 3)), allCols(nCols))
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' [3] assign data to combobox via .Column property
'      (instead of assigning the transposed array to the .List property)
' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Me.ReferenceCombo.Column = v
End Sub

Private Sub UserForm_Layout()
  Me.ReferenceCombo.ColumnCount = 2
End Sub

Private Function allCols(ByVal ColNum As Long) As Variant()
' Purpose: return array with column numbers from 1,2, to ...ColNum
  ReDim temp(0 To ColNum - 1)
  Dim i As Long
  For i = LBound(temp) To UBound(temp)
      temp(i) = i + 1
  Next i
  allCols = temp
  End Function

 类似资料:
  • 我有一个数据框如下: 我希望它是这样的: 我们的目标是为每个< code>Part和< code>Power创建一列,并填写如下所示的值。每台机器都有不同数量的零件,但最多为8个(这将导致列< code>Part8_PowerA和< code>Part8_PowerB)。当机器没有某个部件时,Part_Power的值用-1填充。 我已经寻找了很长时间的解决方案,包括这个,但是我不能适应我的情况,我

  • 我有一个带有2个组合框(组合框1和组合框2)以及“保存”和“取消”按钮的用户表单。我的目标是,每当我选择一个组合框中的一个项目时,另一个应该被“阻止”或禁用。因此,当按下保存按钮时,它只能从这两个组合框之一中保存一个项目。 这就是我已经走了多远: 现在的问题是,当我为combobox1选择一个项目,为combobox2选择一个项目时,它仍然保存它。

  • 问题内容: 我已经编写了此函数,用于将元组列表转换为列表列表。有没有更优雅的/ Pythonic的方式来做到这一点? 问题答案: 您可以使用列表推导:

  • 问题内容: 我如何转换 至 问题答案: 使用简单的列表理解: 会给你:

  • 问题内容: 我需要将列表转换为一列熊猫数据框 当前列表(len = 3): 所需的熊猫DF(形状= 3,): 请注意,这些数字代表上述“必需熊猫” DF中的索引。 问题答案: 采用: 谢谢DYZ:

  • 我正在尝试将列表转换为元组。 Google上的大多数解决方案提供以下代码: 但是,当我运行代码时,它会产生一条错误消息: TypeError:“tuple”对象不可调用 我如何解决这个问题?