2016-10-12 80 views
0

我有一個代碼導入一個表,然後繼續隱藏與最終用戶無關的列。VBA - 複製粘貼到可見列

作爲格式化過程的一部分,我需要添加一個標題到由合併和未合併單元組成的excel文檔。

我的問題是,考慮到一些列已被隱藏的事實,這是不可能導入標題。標題需要粘貼在許多非順序列中。有沒有辦法做到這一點?

僅供參考我已複製粘貼了我用來隱藏列的代碼。我猜測我需要找到一種方法來刪除列。這樣做的問題是,如果我執行Columns(I).delete,則循環在刪除第一列後結束。

注意:代碼中的計數會產生17列。爲了保密,我改變了我在if條件中檢查的一些命名和列數。如果有任何其他的信息,你需要請讓我知道

編輯:經進一步調查和YowE3K的評論在代碼中的問題是,它是跳過給定列的處理一個被刪除之後(因爲它是現在在專欄中,我將代碼認爲它已經處理)

Sub NewView() 
ActiveWindow.DisplayHeadings = False 
Application.ScreenUpdating = False 
ActiveSheet.Range("A14:Z14").Copy 
ActiveWorkbook.Sheets.Add Before:=Worksheets(Worksheets.Count) 
ActiveWorkbook.ActiveSheet.Name = "Temp_View" 
ActiveWorkbook.Sheets("Temp_View").Activate 
Worksheets("Temp_View").Range("B1").Formula = "=COUNTA($8:$8)" 
ActiveSheet.Range("B8").PasteSpecial _ 
Paste:=xlPasteValues 
Dim countUsedCols As Long 
countUsedCols = ActiveWorkbook.Sheets("Temp View").Range("B1").Value 
Dim currentColName As String 
Dim newColName As String 

For i = 2 To countUsedCols + 1 


    currentColName = ActiveSheet.Cells(8, i).Value 

    If currentColName <> "Salary" and currentColName<>"Net Worth" Then 
     ActiveSheet.Columns(i).Select 
     Selection.EntireColumn.Hidden = True 
     'Selection.EntireColumn.Delete 
+0

您可以在VBA代碼中插入標頭嗎?即每次** **不**時隱藏一列,將下一個標題(從您存儲的任何位置開始)放入正在處理的列的相應行中。 (如果你創建一些'Worksheet'變量並將其中的每一個變量設置爲你正在使用的工作表 - 例如''在開始時設置wsSrc = ActiveSheet',然後'設置wsTempView = ActiveSheet',在添加新工作表後,並將'Set wsHeaders = Worksheets(「Headers」)'指向標題表)。 – YowE3K

+1

我看不出爲什麼刪除列會導致代碼在刪除後結束。我**可以**看到它會(取決於你有沒有被粘貼到問題中的其他代碼)在刪除之後跳過列處理(因爲它現在在列「i」中你的代碼認爲它已經處理完畢) - 但這完全不同於完全停止處理的問題。 – YowE3K

+0

經過進一步調查,似乎你所說的正在發生。我錯誤地解釋了這個問題。你會建議做什麼修復?我不知道有一個條件允許我跟蹤列是否被刪除或不是 – Adit2789

回答

2

的最佳途徑遍歷的行或列(如果你要刪除其中的一些)的退步:

For i = countUsedCols To 2 Step -1 

currentColName = ActiveSheet.Cells(8, i).Value 

If currentColName <> "Salary" And currentColName <> "Net Worth" Then 
    ActiveSheet.Columns(i).Delete 
End If 

你沒有惹你變量或擔心的effexcts這樣刪除的單元格。另外:在刪除之前,你不需要選擇列。

+0

謝謝。這是比我更優雅的解決方案 – Adit2789

0

所以,回答這個問題最終如下:

For i = 2 To countUsedCols 

currentColName = ActiveSheet.Cells(8, i).Value 

If currentColName <> "Salary" and currentColName<>"Net Worth" Then 
    ActiveSheet.Columns(i).Select 
    'Selection.EntireColumn.Hidden = True 
    Selection.EntireColumn.Delete 
    i = i - 1 
    If currentColName = "" Then 
     Exit for 
    End if 
.... 
End if 

很奇怪簡單