我的宏通过写入活动工作簿中所有工作表的所有数据来创建大型文本文件。所有相关单元格的Excel VBA范围
在每个工作表中,有必要确定将保存在文本文件中的某个矩形范围的单元格。它的左上角始终是A1,但应该选择右下角,以便范围包括具有任何内容的所有单元格(格式无关紧要)。
我以为ws.Range(“A1”).CurrentRegion会做的,但它不起作用,当A1和附近的单元格是空的。如果工作表中只有数据的单元格为Q10,则范围应为A1:Q10。
当然,我可以遍历ws.Cells范围来发现感兴趣的范围,但这相当耗时,我希望有更有效的方法。如果我选择工作表中的所有单元格并复制粘贴到记事本,则最终不会有数百个空列和数千个空行,只会复制相关数据。问题是如何用VBA复制这个问题。
这是我到目前为止的代码:
Sub CreateTxt()
'This macro copies the contents from all sheets in one text file
'Each sheet contents are prefixed by the sheet name in square brackets
Dim pth As String
Dim fs As Object
Dim rng As Range
pth = ThisWorkbook.Path
Set fs = CreateObject("Scripting.FileSystemObject")
Dim outputFile As Object
Set outputFile = fs.CreateTextFile(pth & "\Output.txt", True)
Dim WS_Count As Integer
Dim ws As Worksheet
Dim I As Integer
WS_Count = ActiveWorkbook.Worksheets.Count
For I = 1 To WS_Count
Set ws = ActiveWorkbook.Worksheets(I)
outputFile.WriteLine ("[" & ws.Name & "]")
Debug.Print ws.Name
Set rng = ws.Range("A1").CurrentRegion
outputFile.WriteLine (GetTextFromRangeText(rng, vbTab, vbCrLf))
Next I
outputFile.Close
End Sub
Function GetTextFromRangeText(ByVal poRange As Range, colSeparator As String, rowSeparator As String) As String
Dim vRange As Variant
Dim sRow As String
Dim sRet As String
Dim I As Integer
Dim j As Integer
If Not poRange Is Nothing Then
vRange = poRange
Debug.Print TypeName(vRange)
For I = LBound(vRange) To UBound(vRange)
sRow = ""
For j = LBound(vRange, 2) To UBound(vRange, 2)
If j > LBound(vRange, 2) Then
sRow = sRow & colSeparator
End If
sRow = sRow & vRange(I, j)
Next j
If sRet <> "" Then
sRet = sRet & rowSeparator
End If
sRet = sRet & sRow
Next I
End If
GetTextFromRangeText = sRet
End Function
如果有什么事情在A1:B2细胞,这个宏的作品。当A1:B2为空并且CurrentRegion属性返回空时,它会中断。
你有尝试范围(“A1”)。specialcells(xllastcell)? – Rosetta
谢谢,你指出的SpecialCells方法帮助我想出了这个:'ws.Range(“A1:”&ws.Cells.SpecialCells(xlLastCell).Address)' – Passiday