1

VBAは上記のエラーを回線にスローしています Sheets("Sheet1").Range("A" & i).Copy Destination:=Sheets("Sheet2").Range("A" & i & "A" & LastCol - 1)

私がやろうとしているのは、実際には"A" & iセル(最初の反復ではA2)をSheet2という名前の2番目のワークシートの範囲にコピーすることです。

Sub FindFill()

Dim DatesRange As Range
Dim i As Integer
Dim TransposeThis As Range
Dim LastCol As Integer

If WorksheetFunction.CountA(Cells) > 0 Then
   LastColumn = Cells.Find(What:="*", After:=[A1], _
   SearchOrder:=xlByColumns, _
   SearchDirection:=xlPrevious).Column
End If


With Sheets("Sheet1")
    Set DatesRange = Range("B2" & LastCol)
End With
i = 1
Do While i <= ActiveSheet.Rows.Count
    Sheets("Sheet1").Range("A" & i + 1).Copy Destination:=Sheets("Sheet2").Range("A" & i & "A" & LastCol - 1)
    i = i + 1
Loop




End


End Sub
4

1 に答える 1

4

「A」の前に「:」がありません

Range("A" & i & ":A" & LastCol - 1)

ファローアップ

私があなたのコメントを調べた後、私はあなたのコードにたくさんのエラーを見ました

1)iとして調光しましIntegerた。これにより、最後の行が32,767を超える場合、Excel2007以降でエラーが発生する可能性があります。に変更してLongください。このリンクをご覧になることをお勧めします。

トピック:整数、長整数、およびバイトのデータ型

リンク: http: //msdn.microsoft.com/en-us/library/aa164754%28v=office.10%29.aspx

上記のリンクから引用

整数変数は-32,768から32,767の範囲の値を保持でき、長整数変数は-2,147,483,648から2,147,483,647の範囲の値を保持できます。

2)最後の列を見つけていますが、どのシートにありますか?このようにパスを完全に修飾する必要があります。

    If WorksheetFunction.CountA(Sheets("Sheet1").Cells) > 0 Then
       LastCol = Cells.Find(What:="*", After:=[A1], _
       SearchOrder:=xlByColumns, _
       SearchDirection:=xlPrevious).Column
    End If

同じことが

With Sheets("Sheet1")
    Set DatesRange = Range("B2" & LastCol)
End With

あなたは前にDOTを逃していますRange

これは正しい方法です...

.Range("B2....

またRange("B2" & LastCol)、あなたが望む範囲をあなたに与えることはありません。範囲を作成する方法については、以下のコードを参照してください。

3)変数を使用していますLastColumnが、を使用していますLastColOption Explicitこのリンクも参照することをお勧めします(リンクのポイント2を参照)を使用することを強くお勧めします。

トピック:「Err」は人間です

リンクhttp ://www.siddharthrout.com/2011/08/01/to-err-is-human/

4)ある場合はどうなり.CountA(Sheets("Sheet1").Cells) = 0ますか?:)代わりにこのコードをお勧めします

    If WorksheetFunction.CountA(Sheets("Sheet1").Cells) > 0 Then
       LastCol = Cells.Find(What:="*", After:=[A1], _
       SearchOrder:=xlByColumns, _
       SearchDirection:=xlPrevious).Column
    Else
        MsgBox "No Data Found"
        Exit Sub
    End If

5) ActiveSheet.Rows.Count最後のアクティブな行は表示されません。そのシートの行の総数が表示されます。データがある列Aの最後の行を取得することをお勧めします。

あなたはそのためにこれを使うことができます

With Sheets("Sheet")
    LastRow =.Range("A" & .Rows.Count).End(xlup).row
End With

LastRow代わりにを使用する毎回インクリメントする必要がないように、ActiveSheet.Rows.Countを使用することもできます。例えばFor Loopi

For i = 1 to LastRow

6)最後に、を使用しないでくださいEnd。理由は非常に単純です。これは、電源オフボタンを使用してコンピュータを切り替えるようなものです。Endステートメントは、Unload、QueryUnload、Terminateイベント、またはその他のVisual Basicコードを呼び出さずに、コードの実行を突然停止します。また、他のプログラムによって保持されているオブジェクト参照(存在する場合)は無効になります。

7)チャットでのあなたのイメージに基づいて、あなたはこれをやろうとしていると思いますか?これは、ループを使用しないコードを使用します。

Option Explicit

Sub FindFill()
    Dim wsI As Worksheet, wsO As Worksheet
    Dim DatesRange As Range
    Dim LastCol As Long, LastRow As Long

    If Application.WorksheetFunction.CountA(Sheets("Sheet1").Cells) = 0 Then
        MsgBox "No Data Found"
        Exit Sub
    End If

    Set wsI = Sheets("Sheet1")
    Set wsO = Sheets("Sheet2")

    With wsI
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
        Set DatesRange = .Range("B1:" & Split(Cells(, LastCol).Address, "$")(1) & 1)

        .Columns(1).Copy wsO.Columns(1)
        DatesRange.Copy
        wsO.Range("B2").PasteSpecial xlPasteValues, _
        xlPasteSpecialOperationNone, False, True

        .Range("B2:" & Split(Cells(, LastCol).Address, "$")(1) & LastCol).Copy
        wsO.Range("C2").PasteSpecial xlPasteValues
    End With
End Sub
于 2012-07-02T06:43:26.060 に答える