我完全不懂VBA,所以如果这看起来微不足道,我深表歉意。我在Excel电子表格中有一个简单的数据集,它有400行和3列。它被分组为4行的较小集合(1行标题和3行数据(,看起来如下:
Set1 A B
1 2.5 1.25
2 4.2 3.35
3 6.7 5.75
Set2 A B
1 3.3 1.65
2 4.1 1.1
3 2.2 7.59
Set3 A B
1 5.4 2.7
2 3.9 3.35
3 6.7 12.42
我想做的是
- 每4行(标题和数据(写入一个单独的制表符分隔的.txt文件
- 使用组的名称(例如Set1(作为输出文件名(例如Set1.txt(
我有限的理解是,我需要
- 循环通过一系列单元格的行
- 将第一个单元格捕获为文件名的字符串
- 使用该字符串创建/打开输出文件
- 将行块写入文件
- 继续循环的下一次迭代
很抱歉,我甚至不能提供一小段代码作为入门。我只是很难解析我在这个网站和其他网站上能找到的各种VBA代码。
尝试
Sub test()
Dim rngDB As Range, rng As Range
Dim r As Long, i As Long
Dim Fn As String, myPath As String
myPath = ThisWorkbook.Path & ""
Set rngDB = Range("a1").CurrentRegion
r = rngDB.Rows.Count
With rngDB
For i = 1 To r Step 4
Set rng = .Range("a" & i).Resize(4, 3)
Fn = myPath & .Range("a" & i) & ".txt"
TransToText rng, Fn
Next i
End With
End Sub
Sub TransToText(rng As Range, strFile As String)
Dim vDB, vR() As String, vTxt()
Dim i As Long, j As Integer, n As Long
Dim objStream
Set objStream = CreateObject("ADODB.Stream")
vDB = rng
For i = 1 To UBound(vDB, 1)
n = n + 1
ReDim vR(1 To UBound(vDB, 2))
For j = 1 To UBound(vDB, 2)
vR(j) = vDB(i, j)
Next j
ReDim Preserve vTxt(1 To n)
vTxt(n) = Join(vR, vbTab)
Next i
strtxt = Join(vTxt, vbCrLf)
With objStream
'.Charset = "utf-8"
.Open
.WriteText strtxt
.SaveToFile strFile, 2
.Close
End With
Set objStream = Nothing
End Sub
这将循环通过列A并找到其中包含单词"Set"的单元格。
然后,它插入一行一行,这样所有集合都用一个空行分隔。
由于这些区域用空行分隔,因此可以将它们设置为范围区域,因此我们可以循环浏览每个范围区域,将其复制到工作表2中,复制工作表2,它将成为一个新的工作簿,将其保存为文本文件并关闭它。
确保更改代码中的文件夹位置,并使用最后一个斜线((
假设工作表(2(为空,需要对其进行索引,因为代码会更改工作表名称。
Sub Select_Set()
Dim FrstRng As Range
Dim UnionRng As Range
Dim c As Range
Dim sh As Worksheet, ws As Worksheet
Dim RangeArea As Range
Dim fLdr As String, fNm As String
fLdr = "C:UsersDaveSkyDriveDocumentsTestTxtFiles" 'folder location to save text files
Set sh = ActiveSheet
Set ws = Sheets(2)
Application.ScreenUpdating = False
With sh
Set FrstRng = .Range("A2:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
For Each c In FrstRng.Cells
If InStr(c, "Set") Then
If Not UnionRng Is Nothing Then
Set UnionRng = Union(UnionRng, c) 'adds to the range
Else
Set UnionRng = c
End If
End If
Next c
UnionRng.EntireRow.Insert
For Each RangeArea In .Columns("A").SpecialCells(xlCellTypeConstants, 23).Areas
fNm = RangeArea.Cells(1).Value
RangeArea.Resize(, 3).Copy ws.Cells(1, 1)
ws.Name = fNm
ws.Copy
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs fLdr & fNm & ".txt", xlUnicodeText
ActiveWorkbook.Close
Next RangeArea
End With
End Sub
你可以删除空白行
Sub reset()
Columns("A:A").EntireColumn.SpecialCells(xlCellTypeBlanks).EntireRow.Delete
End Sub