【问题标题】:Excel Macro that loops within cells and writes to new file在单元格内循环并写入新文件的 Excel 宏
【发布时间】:2012-11-19 16:13:33
【问题描述】:

在将 Excel 电子表格导入 MySql 链接表之前,我需要一个宏来从 Excel 电子表格中获取一些数据。

有一列慈善机构名称和一列以逗号分隔的id列表(这些代表慈善机构类型) 例如

Column A
CharityName1   
CharityName2
CharityName3
CharityName4

Column B
100, 101,104
 (empty)
104
100,105

我想这样写一个新的csv文件如下

1,100
1,101
1,104
3,104
4,100
4,105

提前感谢您的帮助

【问题讨论】:

标签: excel vba


【解决方案1】:

此代码将快速创建具有此格式的 csv 文件c:\temp\dump.csv

[已更新以处理您的格式 我注意到您可能丢失了数据,因为 Excel 已将科学记数法应用于您的字段。现在我添加了一个丑陋的解决方法来填充 0。 B2 应该是一个 30 位的字段吗?]

Sub GetEm()
Dim x()
Dim lngCnt As Long
Dim lngCnt2 As Long
Dim lngE As Long
Dim objFSO As Object
Dim objTF As Object
Dim vArr
Dim vArrElem

Set objFSO = CreateObject("scripting.filesystemobject")
Set objTF = objFSO.createtextfile("c:\temp\dump.csv", 2)

x = Application.Transpose(Range("B1", Cells(Rows.Count, "B").End(xlUp)))
For lngCnt = 1 To UBound(x)
    lngE = InStr(x(lngCnt), "E")
    If lngE > 0 Then
        x(lngCnt) = CStr(Replace(Replace(x(lngCnt), ".", vbNullString), "E+", vbNullString) & Application.Rept("0", Right$(x(lngCnt), 2) - lngE + 1))
    End If
    If Len(x(lngCnt)) > 0 Then
        If Len(x(lngCnt)) Mod 3 = 0 Then
            For lngCnt2 = 1 To Len(x(lngCnt)) Step 3
                objTF.writeline lngCnt & ",'" & Mid$(x(lngCnt), lngCnt2, 3)
            Next
        End If
    End If
Next
objTF.Close

End Sub

【讨论】:

  • 非常感谢 - 当我运行时,我得到:运行时错误 '9' 下标超出范围 - 当我“调试”这一行时: If Len(x(lngCnt)) > 0 Then - 突出显示
  • @PhilBarnett 您可以在任何地方发布您的文件样本吗?
  • 宏运行正常(我犯了一个 nube 错误),但它并不是我所追求的 - 输出文件的第一行是 1102307207308110 - 我所追求的是 1,102 | 1,307 | 1,207 | 1,308 | 1,112 | (其中 '|' 是一个新行) - 这是一个慈善 csv tinyurl.com/c92y9rh 的样本,这是你的宏输出的 csv tinyurl.com/bmo66ua,这是我在 tinyurl.com/cspaxmc 之后的一个例子
  • @PhilBarnett 感谢这些文件。您在问题中的工作示例表明数字由, 分隔。 - 我的第一个代码所依赖的。但我看到这些, 实际上只是格式化,您的数据是一长串数字,需要切成 3 个字符长度。我会更新
  • 当慈善机构 id 的第一个字符 = '2' 所以在上面的例子中只有 1,207 时,我将如何过滤输出以仅写入行
【解决方案2】:

我将遍历第二列并将每个单元格中的值放入一个数组中,我们称之为 mainArray。 (这会迭代行和列,请注意:How to iterate through a variable-column-length range in Excel using VBA

然后我会解析直到分隔符 ',' 并将它们存储在一个名为 cellArray 的数组中,第一个值作为它们从中获取的编号单元格。然后,用新的 cellArray 替换 mainArray 中的原始单元格值。 (String-Manipulation: Split this String delimited by a - character?)

所以单元格 B1 将变为 cellArray = { 1, 100, 101, 104 },这将是 mainArray 中的第一个值。对 B 列中的每个单元格执行此操作以获取已使用的范围。

然后我会创建一个新的 csv (How to create a separate CSV file from VBA?),然后将数据输入其中。

要输入数据,我会遍历每个保存的数组并存储为 CellValue = array[0] + ", " + array[i]

最后,我会保存我的新 CSV 文件。

【讨论】:

  • 这是非常高级别的指导 - 更接近评论而不是答案
  • 谢谢你 - 我可能应该提到我对宏的经验非常有限,所以我真的不知道要实施这个
  • 没问题。如果您不确定,链接应该解释编码的细节。我想我一直更喜欢用艰难的方式做事,哈哈。
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多