VBA - 跨可见列复制粘贴

时间:2016-10-12 23:27:22

标签: excel vba excel-vba

我有一个导入表的代码,然后继续隐藏与最终用户无关的列。

作为格式化过程的一部分,我需要为包含合并和未合并单元格的Excel文档添加标题。

我的问题是,考虑到隐藏了许多列这一事实,证明无法导入标题。标题需要粘贴到许多非连续的列中。有没有办法做到这一点?

作为参考我已经复制粘贴了我用来隐藏列的代码。我猜我需要找到一种删除列的方法。问题是,如果我执行Columns(I).delete,循环在删除第一列后结束。

注意:代码中的counta产生17列。为了保密,我已经更改了我在if条件中检查的一些命名和列数。如果您需要任何其他信息,请告诉我

编辑:经过进一步调查和YowE3K的注释,代码中的问题是在删除一个列之后它正在跳过给定列的处理(因为它现在在列i中,代码认为它已经处理过了)

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

2 个答案:

答案 0 :(得分: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

这样你就不必弄乱你的变量或者担心被删除的细胞的效果。 另外:您需要在删除之前选择该列。

答案 1 :(得分: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

这很奇怪