2017-03-10 12 views
0

私の目標は、最初のDBシートに存在しないデータを見つけて、2番目のDBシートにコピーすることです。最初のDBにはすべてのデータが含まれていますが、2番目のDBシートには特定のフィールド(列)のみが必要です。 (最初のDBシートから)行をコピーし、唯一の特定のフィールド(つまり、列A、D、G、I、& K)を貼り付けるための「きれいな」方法はありません。フィールド/列の間にスペースが残らないようにします。 (すなわち、最初のシート上の列A、D、G、I、&Kは、列A、B、C、D、&Eとなる)。私は別の一時的なシートを使ってこれを行う方法を知っていると思うが、私はこの問題に近づくには "クリーン"な方法がなければならないと考えた。 Any and Allヘルプは高く評価されています。 このソリューションは動作しません:1つのシートから行をコピーして、特定の列のみを新しいシートに貼り付けるにはどうすればいいですか?

Sub columnCopy() 

Dim sh1 As Worksheet 
Set sh1 = Sheets("Sheet4") 

lc = sh1.Cells(1, Columns.Count).End(xlToLeft).Column ' Last Column 
lr = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row ' Last row 

For I = 2 To lr 
    'Trying to only copy columns "A" and "E" from Sheet4 
    sh1.Range(sh1.Cells(I, 1), sh1.Cells(I, 5)).Copy 
    'and paste data into Cells "A" and "B" on Sheet5 
    Sheets("Sheet5").Cells(I, 1).PasteSpecial Paste:=xlPasteValues 

Next I 
'MsgBox I 
End Sub 

おそらくまだだけではなく、列A、B、C、D、&はEが新しいシートにコピーされますことに変わりはない:ここVBA: loop to copy certain columns from main sheet, create a new sheet, and paste

は私の修正コードがあります予想通り、列A & E。助けてください。

+0

:サブSpacedCopyPasteを() レンジ( "A2、E2")が Selection.Copy シート( "のSheet5")を選択」(A4を 範囲を選択します。 ").Select ActiveSheet.Paste End Sub –

+0

値を入力したい場合は、範囲を互いに等しく設定するだけです:' Range([destination range])。 ])。値。 – BruceWayne

答えて

2

ループは必要ありません。行が同じになるので、コピー範囲を結合するだけです。


Sub columnCopy() 

     Dim sh1   As Worksheet 
     Dim rngCopy  As Range 
     Set sh1 = Sheets("Sheet1") 

     lc = sh1.Cells(1, Columns.Count).End(xlToLeft).Column ' Last Column 
     lr = sh1.Cells(sh1.Rows.Count, "A").End(xlUp).Row ' Last row 

     Set rngCopy = Union(sh1.Range(sh1.Cells(2, 1), sh1.Cells(lr, 1)), sh1.Range(sh1.Cells(2, 5), sh1.Cells(lr, 5))) 
     rngCopy.Copy 
     Sheet2.Cells(2, 1).PasteSpecial Paste:=xlPasteValues 
     Application.CutCopyMode = False 


    End Sub 
0

上記cyboashuの優れた答えで述べたように、あなたのソリューションは、希望の列の労働組合を作ることにあります。ユニオンをコピーして貼り付ける際に、そのユニークさを証明する別の方法もあります。

Range("A2:A9", "E2:E9")を使用すると、A2:E9のすべてのセルが参照されます。ただし、文字列セルの範囲を少し調整してRange("A2:A9, E2:E9") A2:A9 ユニオンとE2:E9を連続してブロックB、C、Dを破棄します。これはVBEのイミディエイトウィンドウで?Range("A2:A9", "E2:E9").Address(0, 0)?Range("A2:A9, E2:E9").Address(0, 0)

前述の結合されていない連続した範囲をコピーして貼り付けることは、従来のコピーアンドペースト方法ではコピーと貼り付けの特別な値である&の書式設定コマンドになります。言い換えると、それは結果値に至るまで数式を削除します。これは、Excelが、連続していない連続したソース範囲内の数式アドレスを新しい連続したターゲット先に一致させることができないためです。

Option Explicit 

Sub columnCopy() 
    Dim rngstr As String, lr As Long 

    With Worksheets("Sheet4") 
     rngstr = "A2:A0,D2:D0,G2:G0,I2:I0,K2:K0" 
     lr = .Cells(.Rows.Count, "A").End(xlUp).Row 
     rngstr = Replace(rngstr, "0", lr) 
     .Range(rngstr).Copy Destination:=Worksheets("Sheet5").Cells(2, 1) 
    End With 
End Sub 

だから、この代替案は、それが簡単に不連続細胞の大グループを構成することがあり、あなたが式の値と一緒に書式設定を運ぶ気にしない場合には、コピー&ペーストの値の方法を簡素化しません。実際、後者は好ましい行動であるかもしれない。私はステップを記録し、それが正常に動作します作成したマクロを実行すると

関連する問題