Excel VBA - 避免将 UF ListBox 数组写入工作表时出现错误 1004

2023-12-09

Task

我的目的是使用数据字段方法以最有效的方式将 UserForm 列表框数据写回工作表范围。

基本方法(特别是使用数据范围)

AFAIK 将数据写入某个范围的最有效方法是使用数组。如果数据源自某个范围,最好使用数据字段数组,默认情况下是二维的(一基数组)并允许 a) 将数据从工作表获取到数组或 b) 将数组写回sheet 用一行代码:

Dim v   ' As Variant
Dim rng As Range
Set rng = ...

' a) range to array
      v = rng.Value

' b) array to range
     rng.Value = v

使用 ListBox 数据数组时的差异

ListBox数据存储在2dim中,但是零基础数组,例如列表框1.列表

[提示:因此可以使用预定义数组而不是使用众所周知的 Add 方法来创建项目,顺便说一句,仅限 10 列(索引 0 到 9)。 ]

尽管存在这种差异,但可以使用所描述的基本方法读入 ListBox 数据并将其写回工作表:

 ' aa) ListBox data to array
   v = Me.ListBox1.List

 ' bb) array to range
rng.Value = v

此外,我还指出,默认情况下数组列数为 10,因此这与以编程方式设置的 ColumnCount 不对应。因此,有必要调整范围检查数组维度,参见。代码示例中的调试协议。

问题和解决方法

如果存在带有前导“==”字符串或类似用户输入的项目,则将数据字段数组写回单行中的工作表会引发错误 1004(应用程序定义的或对象定义的错误),因为这无法正确解释通过 Excel。

我尝试使用

rng.Text  = v

代替

rng.value = v

也失败了,导致 424 object need 错误。

Question==> 是否可以纠正带有前导“=”字符的潜在错误项不循环使用 VBA 或 API 方法遍历所有数组项?欢迎任何代码示例来替换我的工作(代码中的步骤 3)

My Code

我的代码由四个步骤组成 1)创建一个2dim数据字段数组(v) 2)设定目标范围(rng) 3)[我纠正每个数组项的工作] 4)将数据写回工作表

Private Sub CommandButton1_Click()
' declare variables
  Dim ws As Worksheet
  Set ws = ThisWorkbook.Worksheets("Dump")

  Dim s     As String             ' range address string
  Dim sTest As String             ' item test string
  Dim v     As Variant            ' data field array
  Dim rng   As Range              ' (target) range
  Dim i     As Long               ' rows counter
  Dim j     As Long               ' columns counter
  Dim R     As Long               ' number of rows
  Dim C     As Integer            ' number of columns
  Dim lbxR  As Long               ' actual number of listbox items   in data field
  Dim lbxC  As Integer            ' actual number of listbox columns in data field
' Error Handler
  On Error GoTo OOPS

' get programmatically defined listbox dimension
  R = Me.ListBox1.ListCount
  C = Me.ListBox1.ColumnCount
' clear sheet lines A2:A{r}
  ws.Range(ws.Cells(2, 1), ws.Cells(R, C)).value = ""
' ===============================
' 1) create 2dim data field array
' -------------------------------
  v = Me.ListBox1.List

' -------------------------------
' 2) set target range (rng)
' -------------------------------
' get actual data field dimension
  lbxR = UBound(v, 1) - LBound(v, 1) + 1    ' first dimension
  lbxC = UBound(v, 2) - LBound(v, 2) + 1    ' second dimension
  s = ws.Range("A2").Resize(lbxR, lbxC).Address
' set correconding target range
  Set rng = ws.Range(s)                           ' target range

' create short protocol - columns by default differ from user defined ColumnCount property !
  Debug.Print String(80, "-")
  Debug.Print vbNewLine & "** ListBox1 Defs            Data Field Array Dimension **"
  Debug.Print "                            [Target Range " & s & "]"
  Debug.Print String(80, "-")
  Debug.Print "   ListCount  = " & ListBox1.ListCount, "rows = " & lbxR & " = ubound(v,1)-lbound(v,1)+1 = " & UBound(v, 1) & " - " & LBound(v, 1) & " + 1 "
  Debug.Print "   ColumnCount= " & ListBox1.ColumnCount, "cols = " & lbxC & " = ubound(v,2)-lbound(v,2)+1 = " & UBound(v, 2) & " - " & LBound(v, 2) & " + 1 "
  Debug.Print String(80, "-")

' ----------------------------------------------------------------
' 3) Work around - correct leading "=", if any occurences presumed
'    (avoid error 1004 - App-defined or object-defined error)
' ----------------------------------------------------------------
' ==> Is there an alternative way? 
' For i = 0 To R - 1            ' edited thx to D.Lee 
'   For j = 0 To C - 1
'      v(i, j) = IIf(Left(Me.ListBox1.List(i, j) & "", 1) = "=", " ", "") & _
'                          Me.ListBox1.List(i, j)
'   Next j
' Next i     
' -------------------------------
' 4) write data back to worksheet
' -------------------------------
  rng.value = v

Exit Sub

' =============
' Error Handler
' =============
OOPS:
  MsgBox "ERL=" & Erl & " |Error " & Err.Number & "|" & Err.Description & vbNewLine & _
         "s=" & s, vbExclamation

End Sub  

Tip我推荐阅读“VBA 中的数组和范围”作者:C.Pearson

2017 年 9 月 17 日的 OP 附录(替代解决方案)

例如,如果您知道第一个目标列仅是文本,则可以在第 [4] 节之前编写以下语句,而不是搜索以=:

rng.Columns(1).NumberFormat = "@"

Lbound(v,1) = 0 ubound(v,1) = r-1 所以,需要修改i和j。

  For i = 0 To R - 1
      For j = 0 To C - 1
         v(i, j) = IIf(Left(Me.ListBox1.List(i, j) & "", 1) = "=", " ", "") & _
                             Me.ListBox1.List(i, j)
      Next j
  Next i
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel VBA - 避免将 UF ListBox 数组写入工作表时出现错误 1004 的相关文章

  • 使用 ClosedXML 创建数据透视表

    我正在尝试使用 ClosedXML V0 91 1 创建数据透视表 但我不断遇到问题 因为我的 Excel 文件包含不可读的内容 然后 Excel 工作簿在单击时删除了我的数据透视表Yes below 下面是我击中时的显示Yes 它正在删除
  • 合并 JavaScript 数组中的重复项

    我有一个愚蠢的问题 乍一看似乎很容易解决 但结果却很棘手 我有一个对象数组 每个对象都有两个属性 id 和 value id 2 value 10 id 4 value 3 id 2 value 2 id 1 value 15 我想编写一个
  • 返回条件格式化单元格内部颜色的函数

    我想要一个返回条件格式单元格颜色索引值的函数 它用于检查一行中的多个单元格 如果它们使用条件格式突出显示 则需要执行操作 检查单元格中是否有颜色比创建覆盖条件的组合条件公式更简单所有细胞的 或者说我是这么想的 尽管代码在消息框中有效 但下面
  • Powershell - 在不安装 Excel 的情况下将 CSV 转换为 XLS

    我有一台自动生成报告的服务器 报告采用 CSV 格式 我需要能够直接加密文件 无需第三方压缩 无 WinZIP 或 WinRAR 我认为最好的想法是将 CSV 转换为 XLS 然后通过 Powershell 密码保护 XLS 文件 不幸的是
  • 在 C 中通过引用传递数组

    我是 C 新手 我有一个疑问 由于 C 函数创建其参数的本地副本 我想知道为什么以下代码按预期工作 void function int array array 0 4 array 1 5 array 2 6 int main int arr
  • 如果 Excel 中的表格包含单元格引用,如何对其进行排序?

    我在工作表 1 中有一个 Excel 数据表 它引用了许多其他工作表中的各种不同单元格 当我尝试对工作表进行排序或过滤时 引用会随着单元格的移动而发生变化 但是 我不想手动进入每个单元格并在各处插入 符号 因为有些引用是连续的 我可能想稍后
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • 在 angular2 中过滤数组

    我正在研究如何在 Angular2 中过滤数据数组 我研究过使用自定义管道 但我觉得这不是我想要的 因为它似乎更适合简单的表示转换 而不是过滤大量数据 数组排列如下 getLogs Array
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • 在 powershell 中打开 Excel 时出错

    我需要用以下命令打开 Excel 文件CorruptLoad来自 powershell 脚本的参数 但是当我尝试做到这一点时 出现错误Exception calling Open with 15 argument s open method
  • 如何修复日期过滤器 VBA,因为它没有拾取我范围内的所有日期

    我正在尝试创建一个过滤器来过滤掉我选择的日期内的所有日期 我选择的日期将始终反映整个月 例如 如果我需要 2019 年 5 月的数据 我将输入开始日期为 01 05 2019 结束日期为 31 05 2019 我的数据过滤器将需要选取经过我
  • 如何正确更新反应钩子状态内的数组

    我一直在尝试更新代表反应状态的数组内的对象 当输入的值更改时应该更新该对象 我可以自己找到一种方法来更新它 但我不太确定这是正确的方法 因为当我打开反应开发工具并转到组件选项卡并单击我正在处理的组件时 在输入输入时状态不会立即更新 并且为了
  • 将用户定义的表类型从 VBA 传递到 SQL

    我的任务是创建一个 Excel 电子表格作为 SQL 数据库的前端 以及一些对数据执行复杂计算的 C 我的老板想要前端作为电子表格 而计算对于 VBA 来说似乎太复杂了 目前 检索数据集的存储过程运行良好 然后 用户将在 Excel 中编辑
  • 用一种方法进行 Ruby 选择和拒绝

    是否有任何内置方法可以结合以下功能Enumerable select 找到该块等于 true 的所有内容 和Enumerable reject 找到该块中所有等于 false 的内容 就像是 good bad list magic meth
  • 如果存储字符串的 char 数组小于字符串,C++ 真正将字符串存储在哪里?

    我正在测试 C Premiere 书中有关 C 字符串的示例 const int size 9 char name1 size char name2 size C owboy 8 characters here cout lt lt How
  • Java:不使用 Arrays.sort() 对整数数组进行排序

    这是我们 Java 课程的练习之一中的说明 首先 我想说我 做了我的功课 我不仅仅是懒惰地请 Stack Overflow 上的人帮我回答这个问题 在所有其他练习中 这个特定项目一直是我的问题 因为我一直在努力寻找 完美的算法 编写JAVA
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • Excel 公式从单元格中获取字符串值并按字母顺序对其字符进行排序

    你能帮我制作一个 Excel 公式 从单元格中获取字符串值并按字母顺序对其字符进行排序吗 Ex 原始单元格值 BACR 已排序的字符单元格 ABCR 编辑 2022 年 4 月 29 日 随着 Office 365 Excel 中引入的动态

随机推荐