2016-10-12 8 views
0

テーブルをインポートして、エンドユーザーに関係のない列を非表示にするコードがあります。VBA - 表示されている列に貼り付けをコピーする

フォーマットプロセスの一環として、Excelの差し込み印刷されたセルと結合されていないセルで構成されるヘッダーをExcelに追加する必要があります。

私の問題は、いくつかの列が隠されていることを考慮すると、ヘッダーをインポートすることが不可能であることが証明されています。ヘッダーは、多数の非連続列に貼り付ける必要があります。それを行う方法はありますか?

参考のために、最初に列を非表示にするために使用するコードをコピーして貼り付けました。私は代わりに列を削除する方法を見つける必要があると推測しています。その問題は、私がColumns(I).deleteを実行すると、最初の列を削除した後にループが終了するということです。

注:コード内のcountaは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コードにヘッダーを挿入できますか?つまり、**列を非表示にしない場合は、次のヘッダー(どこに格納されているか)を取得し、処理している列の適切な行に挿入します。 (ワークシート変数をいくつか作成し、使用しているワークシートにそれらの変数を 'Set'しておくと、もっと簡単になります。例えば' Set wsSrc = ActiveSheet'を最初に設定し、 'Set wsTempView = ActiveSheet'新しいシートを追加した後、 'Set wsHeaders = Worksheets(" Headers ")'がヘッダシートを指すようにしてください) – YowE3K

+1

なぜ列を削除すると、削除後にコードが終了するのかわかりません。私は**あなたが質問に貼り付けられていない他のコードに応じて、あなたが削除した列の処理をスキップすることができます。あなたのコードはそれが既に処理されていると思う) - しかし、それは単に処理を完全に止めることとは全く異なる問題です。 – 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 

それは奇妙簡単だった

関連する問題