【发布时间】:2017-01-28 14:36:43
【问题描述】:
我想将给定范围内的值转换为 VBA 字符串,其中原始单元格值由任何选定的列分隔符和行分隔符分隔。分隔符可以是一个字符或更长的字符串。行分隔符是行尾的字符串。字符串应该就像我们从左上角,从左到右,到右下角读取文本一样完成。
这是 A1:C5 范围内的 VALUES 示例:
+----+----+----+
| A1 | B1 | C1 |
+----+----+----+
| A2 | B2 | C2 |
+----+----+----+
| A3 | B3 | C3 |
+----+----+----+
| A4 | B4 | C4 |
+----+----+----+
| A5 | B5 | C5 |
+----+----+----+
期望的结果是一个 VBA 字符串:
A1,B1,C1@$A$2,$B$2,$C$2@A3,B3,C3@A4,B4,C4@A5,B5,C5@
为了便于阅读,我会这样显示:
A1,B1,C1@
A2,B2,C2@
A3,B3,C3@
A4,B4,C4@
A5,B5,C5@
我选择了,(逗号)作为列分隔符,并选择了@ 符号作为行分隔符。当然这些可以是任何字符,例如\r\n。
我想要从范围快速烹饪字符串的原因是因为我想通过 ADO 连接将它发送到 SQL Server。正如我到目前为止所测试的那样,它是即时传输大量数据的最快方式。如何在 SQL Server 上拆分此字符串的孪生问题在这里:Split string into table given row delimiter and column delimiter in SQL server
解决方案 1. 循环遍历所有行和列。问题是是否有任何更优雅的方式,然后只是循环遍历所有行和列?我更喜欢 VBA 解决方案,而不是公式一。
解决方案 2。 由 Mat's Mug 在评论中建议。 CSV 文件是所需的结果。我想在不保存的情况下即时进行。但好的一点 - 模仿 CSV 是我想要的,但我想要它而不保存。
赏金后编辑
Thomas Inzina 的答案工作得非常快,而且他的解决方案是可移植的。事实证明,普通 VBA 循环比大型数据集上的 JOIN 等工作表函数要快得多。为此,我不建议在 VBA 中使用工作表函数。我已经投票给每个人。谢谢大家。
【问题讨论】:
-
首先想到的是 Save As -> CSV - 如果需要,然后将文件读入字符串。问题是为什么你需要一个以逗号分隔的字符串中的单元格值列表?
-
重新更新 - 您不打算在 INSERT 语句中使用它,是吗?如果是这种情况,您可能需要重新考虑这一点并改用参数化查询。
-
感谢您的提示。 @Comintern 是的,不幸的是我想这样做。我在这里知道其他类似的解决方案:excel-sql-server.com 但是,具有一个大参数的存储过程 - 字符串 - 后来在 SQL 服务器上被切割成碎片以进行插入是最快的解决方案。比我所知道的 Excel 方面的所有解决方案都要快得多。
-
我看到赏金仍然开放 - 有什么没有正确完成的答案?我们缺少什么?
-
我相信我的函数将成为构建字符串的最快方法,但是,由于它的多功能性,我会使用 ADO Recordset.getString 方法来构建它。