2016-10-12 75 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 

很奇怪简单