2011-07-18 4 views
3


     私は現在の千鳥セットにサブ内2D配列から転送された情報を取得するために、VBAを経由して、より効率的な方法を探していますと範囲Excelブックの範囲。私は以下の例に必要なものを蒸留してコードを完成させました。どんな助けでも大歓迎です。エクセルVBAは:スタッガードを移植して2次元配列データ

     私は、作業しているもの(入力、配列、出力)の例を記述した画像をリンクし、以下で使用しているコードの例を書いています。簡略化のためのワークブック内のSheet2とシート1として「入力シート」と「出力用紙」を定義してみましょう:

Input Sheet

Option Explicit 

    Sub TransferData() 
    Dim myArray as Variant   'Define the array to hold the data. 
    Dim i as integer     'Define a generic loop counter variable. 

    myArray = Sheet1.Range("A1:F7") 'Pulls all the relevant data into the array. 

      myarrayのは、今まさに範囲のように見えます。 (私は3番目のリンクを投稿したいと思いますが、もう少し多くの担当者を獲得する必要があります)。私はそれがこのようになりますように、私の出力ファイルにデータを転送したい

     :ここ

Output Sheet

     は、私は、現在の状況にアプローチする方法である:

For i = 1 to ubound(myArray) 
     Sheet2.Cells(i,1) = myArray(i,1) 
     Sheet2.Cells(i,3) = myArray(i,2) 
     Sheet2.Cells(i,6) = myArray(i,3) 
     Sheet2.Cells(i,7) = myArray(i,4) 
     Sheet2.Cells(i,8) = myArray(i,5) 
     Sheet2.Cells(i,9) = myArray(i,6) 
    Next i 
    End Sub 

     私の質問はこれです。どのように配列をつかんでいたかと同じように、配列のデータをずらした範囲に転送する方法があります。一度に範囲?例えば、の線に沿って何か:

Sheet2.Range("A1:A8") = myArray(1 to 7, 1) 'Note: this is total pseudocode 
Sheet2.Range("C1:C8") = myArray(1 to 7, 2) 'Note: this is total pseudocode 

等...等...私は、私がこれまで自分自身VBAのかなりの量を教えることができたと考えてい

     けど間違いなくすべてを知らないと、これは私が助けが必要なものです。私はVBAからワークシートへの書き込み量を最小限にしようとしています。彼らは本当に彼らの通行料を取る。

     ご協力いただきまして誠にありがとうございます。

   ありがとうございます!

+0

Sheet2などのセルC2の式として '= Sheet1!B1'を使用しているだけではないという理由があるとします。 – mwolfe02

+0

また、それ自体は答えではありませんが、 ( 'Application.ScreenUpdating = False')あなたの既存のアルゴリズムを大いにアップしてください。ちょうどあなたのエラーハンドラであなたのルーチンを終了する前にそれを有効にすることを忘れないでください。 – mwolfe02

+0

絶対に。まず、画像を追加してくれてありがとう! sheet1を編集しようとしているユーザーは行を削除する傾向があります。参照されたセルを削除すると#REFエラーが発生するのを避けようとしています。私の回避策は、配列全体に範囲全体をフラッシュし、素早く読み書きできるようにすることでした。それは理にかなっていますか? – Prej1

答えて

2

"コピーして貼り付け"すると値がかなり速くなることがあります。あなたは明らかにあなたの目的に合わせて、これを一般化する必要がありますが、このコードは、あなたが提供されているサンプルで動作します:

Sub TransferData() 

    Sheet3.Range("A1:A7") = Sheet1.Range("A1:A7").Value 
    Sheet3.Range("C1:C7") = Sheet1.Range("B1:B7").Value 
    Sheet3.Range("F1:I7") = Sheet1.Range("C1:F7").Value 

End Sub 
+0

この答えは、私がこのメソッドを使用することを忘れてしまったので、実際に私に面白かった。あなたは、マクロの実行時間を数桁減らすための軌道に乗ってくれました。すべての助けてくれてありがとう! – Prej1

1

「他のデータ」のサイズによっては、これを近づいての1つの非常に簡単な方法を挿入しますすべてのデータを出力範囲に転送し、次に新しい列を挿入し、他のデータを適切な場所に配置することです。例えば

:あなたは、あなたが作成した新しいカラムのすべてにあなたの「他のデータ」をドロップすることができ

data = Worksheets("InputSheet").Range("A1:F7").Value 
Worksheets("OutputSheet").Range("A1:F7").Value = data 
Worksheets("OutputSheet").Columns("B").EntireColumn.Insert ' do this for every column you need, within reason. 

+0

ありがとうポール;私は入力を感謝します。私はあなたとmwolfeが言ったものを奪い、それをうまく使いこなしました。そして、私は助けに感謝します! – Prej1