将 Excel 范围转换为 VBA 字符串

2024-05-18

我想将给定范围内的值转换为 VBA 字符串,其中原始单元格值由任何选定的列分隔符和行分隔符分隔。分隔符可以是一个字符或更长的字符串。行分隔符是行末尾的字符串。该字符串应该像我们从左上角、从左到右、到右下角读取文本一样完成。

以下是范围 A1:C5 中的值的示例:

+----+----+----+
| 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 上分割这个字符串的双重问题在这里:在 SQL Server 中将字符串拆分为给定行分隔符和列分隔符的表 https://stackoverflow.com/questions/39752188/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 中的工作表函数。我已经给大家投票了。谢谢你们。


为了优化性能,我的函数模拟了字符串生成器。

变量

  • 文本:用于保存数据的非常大的字符串
  • CELL LENGTH:决定 Buffer Size 大小的常量
  • BufferSize:文本字符串的初始大小
  • Data():从源范围派生的数组

当 Data() 数组的行和列在当前元素上迭代时 (Data(x, y)) 值替换文本字符串的一部分。根据需要调整文本字符串的大小。这极大地减少了串联的数量。初始 BufferSize 设置得相当高。通过将 CELLLENGTH 减少到 25,我得到了最好的结果,0.8632813 秒。

从 Sample-Videos.com 下载示例数据 http://www.sample-videos.com/csv/Sample-Spreadsheet-500000-rows.csv

Results

Code

Function getRangeText(Source As Range, Optional rowDelimiter As String = "@", Optional ColumnDelimiter As String = ",")
    Const CELLLENGTH = 255
    Dim Data()
    Dim text As String
    Dim BufferSize As Double, length As Double, x As Long, y As Long
    BufferSize = CELLLENGTH * Source.Cells.Count
    text = Space(BufferSize)

    Data = Source.Value

    For x = 1 To UBound(Data, 1)
        If x > 1 Then
            Mid(text, length + 1, Len(rowDelimiter)) = rowDelimiter
            length = length + Len(rowDelimiter)
        End If

        For y = 1 To UBound(Data, 2)
            If length + Len(Data(x, y)) + 2 > Len(text) Then text = text & Space(CDbl(BufferSize / 4))
            If y > 1 Then
                Mid(text, length + 1, Len(ColumnDelimiter)) = ColumnDelimiter
                length = length + Len(ColumnDelimiter))
            End If

            Mid(text, length + 1, Len(Data(x, y))) = Data(x, y)
            length = length + Len(Data(x, y))
        Next
    Next

    getRangeText = Left(text, length) & rowDelimiter
End Function

Test

Sub TestGetRangeText()
    Dim s As String
    Dim Start: Start = Timer

    s = getRangeText(ActiveSheet.UsedRange)

    Debug.Print "Execution Time: "; Timer - Start; "Second(s)"
    Debug.Print "Rows: "; ActiveSheet.UsedRange.Rows.Count; "Columns: "; ActiveSheet.UsedRange.Columns.Count
    Debug.Print "Result Length: "; Format(Len(s), "#,###")
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 Excel 范围转换为 VBA 字符串 的相关文章

  • Excel Add In - console.log 在哪里输出它的消息 - NodeJS

    我正在尝试使用 JavaScript API 创建 Excel 插件 但我不明白 console log 在哪里输出它们的消息 所有 Microsoft 文档都包含 console log 示例 但没有解释 console log 输出消息
  • 正则表达式提取美国邮政编码,但不提取假代码

    使用 XML 包和 XPath 从网站上抓取地址 有时我只能得到一个嵌入了我想要的邮政编码的字符串 提取邮政编码很简单 但有时会显示其他五位数字的字符串 以下是 df 中问题的一些变体 zips lt data frame id seq 1
  • Excel,循环遍历 XLSM 文件并将行复制到另一个工作表

    我现在遇到的此代码的主要问题是处理我打开的 xlsm 文件的错误 我对这些文件的 VB 代码没有编辑权限 如果 vb 出错 有没有办法跳过文件 我有一个包含大约 99 个 xlsm 文件的文件夹 我希望循环遍历每个文件并复制每个工作簿中的第
  • VB FFT - 难以理解结果与频率的关系

    试图理解我正在使用的 fft 快速傅里叶变换 例程 窃取 回收 输入是 512 个数据点的数组 它们是样本波形 测试数据生成到该数组中 fft 将该数组变换到频域 尝试理解频率 周期 采样率和 fft 数组中位置之间的关系 我用例子来说明
  • 编译器消息“警告:格式‘%s’需要类型‘char *’,但参数 2 具有类型‘char (*)’”

    我正在尝试运行一个简单的 C 程序 但收到此错误 警告 格式 s 需要类型 char 但参数 2 的类型为 char 20 我在跑步Mac OS X v10 8 https en wikipedia org wiki OS X Mounta
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • java的split string方法也可以返回带分隔符的数组

    当我们使用String Split java中对字符串进行分割的方法 其工作原理如下 String s hello my dear String ss s split 数组ss包含 Hello my dear 但在这种情况下 空格 即分隔符
  • 过滤数组以获取唯一字段值

    我知道有很多方法可以过滤数组中的唯一值 但是如何过滤数组中具有给定字段的唯一值的对象呢 例如我有 obj1 obj2 obj3 其中每个对象具有以下形式 firstName lastName 如何过滤数组以最终得到一个最终数组 其中所有对象
  • 以独立于区域设置的方式读取 Excel 文件

    我使用以下代码从各种 Excel 文件读取数据 IMEX 1 to force strings on mixed data HDR NO to process all the available data Locale 1033 is en
  • 当名称是数组时如何使用 Javascript 修改 HTML Select

    我有两个同名的 html select 对象 它们是具有不同索引的数组 我想做的是 如果从类别 0 选择元素中选择 关闭 我想禁用类别 1 元素 我一直在尝试使用 document getElementsByName 但无法弄清楚如何专门针
  • 数组初始化编译时间 - Constexpr 序列

    我正在读书this https stackoverflow com questions 45938798 for loop with variable step size c 45939130关于SO的问题 这个问题本身并不是那么有趣 但我
  • Notepad++:: 通过正则表达式完全删除包含问号的行

    嗯 我想这就是我的标题 这对于我将要实现的目标来说是不言自明的 这是我当前的文本文件的示例 Diva was the winning song of the Eurovision Song Contest 1998 Who will win
  • 将 char* 转换为字符串 C++

    我知道字符串的起始地址 例如 char buf 和最大长度int l 字符串的 即字符总数小于或等于l 获取值的最简单方法是什么string来自指定的内存段 换句话说 如何实现string retrieveString char buf i
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • pq:函数unnest(未知)不是唯一的

    以下代码工作正常 但我想将 array a b c d e 定义为变量 rows err db Query select colname from SELECT date unnest array a b c d e AS colname
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 与 array_intersect 相反?

    是否有一个内置函数可以获取数组 1 中不存在于数组 2 中的所有成员 我知道如何以编程方式执行此操作 只是想知道是否有一个内置函数可以执行相同的操作 所以请不要提供代码示例 这听起来像是一份工作array diff http www php
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • 用户泄漏、libc++ 泄漏或误报

    我正在使用 clang 编译器和 libc 标准库在 C 11 中的 mac 上构建动态库 当我在链接到动态库的测试代码上运行 valgrind 时 我得到一块肯定丢失的内存 这是 valgrind 报告 45659 36 bytes in
  • std::Optional 的转发引用构造函数的约束

    std optional截至目前 有 8 个构造函数 如下所示 也在这里http en cppreference com w cpp utility 可选 可选 http en cppreference com w cpp utility
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • CSS 显示无不工作

    media screen and min width 900px and max width 1215px menu display none 这不起作用 div 仍然可见 但是 如果我将 div 更改为 div class menu 代替
  • Nodejs 中的子域

    如何处理nodejs的子域请求 例如以下代码回显test在控制台中的任何请求http localhost 9876 任何内容 http localhost 9876 5Banything 5D var http require http h
  • 水平分隔符导航栏 IOS 7

    我已经包含了对导航栏 navigationController 的需求 其与栏视图控制器的背景色调相同 现在我有一个问题 在导航栏和视图之间我有一条水平线将它们分开 就像你一样从图片中可以看到 你能告诉我如何删除这条水平黑色线并使其更加一致
  • 如何在 Ember 中捕获数组是否插入到车把中?

    我希望这不是重复的问题 但我无法找到解决方案 我有工作和用户 一个用户有很多工作 JP User DS Model extend firstName DS attr string lastName DS attr string email
  • Perl 正则表达式图灵完备吗?

    我见过 Ruby 和 Perl 程序员做了一些事情复杂的代码挑战 https codegolf stackexchange com questions 3596 regex validating regex完全用正则表达式 这前瞻和后瞻 h
  • 仅在单个端口 8080 上转发到本地主机(Windows)可能吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我知道如何在 Windows 上使用 xampp 设置本地网络服务器 我在主机文件 c windows system32 drivers etc ho
  • 为什么有些包含文件只驻留在 tr1 中?

    当我尝试包含类似内容时
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 使用 PostGIS 拥有通用 GEOGRAPHY 列

    在 PostgreSQL 9 PostGIS 1 5 中 有没有办法创建 通用 GEOGRAPHY 列 我指的是接受 POINT 以及 POLYGON LINESTRING 等的列 到目前为止 我只在 Internet 上看到过像 GEOG
  • jQuery 表格排序

    我有一个非常简单的 HTML 表格 有 4 列 Facility Name Phone City Specialty 我希望用户能够排序设备名称 and City only 我如何使用 jQuery 进行编码 我发现了这个 我想我应该投入
  • React JS 服务器端问题 - 找不到窗口

    你好 我正在尝试在我的reactJS项目中使用react rte 我有服务器端渲染 每次我想使用这个包时 我都会得到 return msie 6 9 b test window navigator userAgent toLowerCase
  • 将 Excel 范围转换为 VBA 字符串

    我想将给定范围内的值转换为 VBA 字符串 其中原始单元格值由任何选定的列分隔符和行分隔符分隔 分隔符可以是一个字符或更长的字符串 行分隔符是行末尾的字符串 该字符串应该像我们从左上角 从左到右 到右下角读取文本一样完成 以下是范围 A1