2016-06-14 54 views
0

我是vba的新手,我試圖創建一個簡單的宏來將一些數據導出到文本文件。然而,當用戶應用任何隱藏行的過濾器時,我只會將所有數據從第一行導出到最後一行,忽略任何過濾掉的內容。我已經搜遍遍了,但(可能是由於我缺乏vba的經驗),我無法找到任何可以與用戶的過濾器和他們的選擇一起工作的任何東西。事情是,我甚至不知道excel是否將過濾行視爲「隱藏」。我也嘗試了許多方法,而不是下面列出的方法,例如.AutoFilter和.SpecialCells(xlCellTypeVisible),但是它們都不適用於Selection。如何將用戶過濾器應用於excel vba中的選擇?

Sub old_export_for() 
Dim myFile As String, rng As Range, cellValue As Variant, i As Integer, j As Integer 
myFile = "C:\OUT\old_out_" + CStr(Format(Now(), "mmddhhmm")) + ".txt" 
Set rng = Selection 
Open myFile For Output As #1 
For i = 1 To rng.Rows.Count 
    If Not rng.Rows.Hidden Then 
    j = 1 
    cellValue = rng.Cells(i, j).Value 
    Print #1, "Filename  : " + CStr(cellValue) 
    j = 2 
    cellValue = rng.Cells(i, j).Value 
    Print #1, "File Size  : " + CStr(cellValue) 
    j = 3 
    cellValue = rng.Cells(i, j).Value 
    Print #1, "Hostname  : " + CStr(cellValue) 
    j = 4 
    cellValue = rng.Cells(i, j).Value 
    Print #1, "Date   : " + CStr(cellValue) 
    j = 5 
    cellValue = rng.Cells(i, j).Value 
    Print #1, "Session ID : " + CStr(cellValue), 
    Print #1, vbNewLine + vbNewLine 
    End If 
Next i 
Close #1 
End Sub 
+0

'SpecialCells'怎麼樣? 'Set rng = Selection.SpecialCells(xlCellTypeVisible)'應該這樣做(沒有隱藏的單元格會在'rng'中 –

+0

我覺得應該可以,但是隻有第一個選定的行被導出 –

+0

我添加了' SpecialCells' ......但要改變這個話題:更好地使用'&'而不是'+'來表示文本......只是爲了避免將來出現錯誤;) –

回答

2

變化

If Not rng.Rows.Hidden Then 

If Not rng.Rows(i).EntireRow.Hidden Then 
+0

我不能相信我錯過了。從字面上盯着這個東西好幾個小時。謝謝。 –

1

如果這沒有幫助,我會刪除答案。假設我們在Sheet1中有自動過濾數據。這個微小的宏將採取標題行和所有可見的數據行並將其複製到Sheet2的

Sub AutoFilterCopyVisible() 
    Sheets("Sheet1").AutoFilter.Range.Copy 
    Sheets("Sheet2").Paste 
End Sub 

運行之後,您可以導出Sheet2中。如果Sheet1中是這樣的:

enter image description here

然後Sheet2中將有:

enter image description here

注:

有一個在輸出紙張沒有自動篩選。

+0

我需要我的結果或多或少的明文。我不會說這不是很有幫助。與我的情況不一樣。 –

+0

@MacroPower感謝您的反饋。 –

+0

它沒有錯首先...我不會刪除這個答案...機會很高,有一個問題完全適合您的解決方案的人碰到這個問題;) –

2

爲了表明我將如何把這個與SpecialCells

Sub old_export_for() 
    Dim myFile As String, rng As Range, cellValue As Variant, xRow As Variant 
    myFile = "C:\OUT\old_out_" + CStr(Format(Now(), "mmddhhmm")) & ".txt" 
    Set rng = Selection.SpecialCells(xlCellTypeVisible) 
    Open myFile For Output As #1 
    For Each xRow In rng.Rows 
     Print #1, "Filename  : " & CStr(xRow.Cells(1).Value) 
     Print #1, "File Size  : " & CStr(xRow.Cells(2).Value) 
     Print #1, "Hostname  : " & CStr(xRow.Cells(3).Value) 
     Print #1, "Date   : " & CStr(xRow.Cells(4).Value) 
     Print #1, "Session ID : " & CStr(xRow.Cells(5).Value) 
     Print #1, vbNewLine & vbNewLine 
    Next i 
    Close #1 
End Sub 

的是,一分這短暫的,我會用這樣的東西不可讀:

Sub old_export_for() 
    Dim xRow As Variant, i As Long, str As String 
    Open "C:\OUT\old_out_" + CStr(Format(Now(), "mmddhhmm")) & ".txt" For Output As #1 
    For Each xRow In Selection.SpecialCells(xlCellTypeVisible).Rows: For i = 1 To 6 
     Print #1, Array("Filename  : ", "File Size  : ", "Hostname  : ", "Date   : ", "Session ID : ", vbNewLine)(i - 1) & Array(CStr(xRow.Cells(i).Value), vbNewLine)(1 + (i < 6)) 
    Next: Next 
    Close #1 
End Sub 

但是不這樣做:P

+0

謝謝!第一個例子更合理。 –

+0

如上所述...不要使用第二個...它只是混淆了ppl(仍然,它的工作原理沒有錯誤):P –

相關問題