1

私はVBAが初めてで、基本的に最初のマクロを書こうとしています。これは、繰り返し値を省略して、あるワークブックから別のワークブックにエントリをコピーするためのものです。次のコードがあります。

Dim s As String

Do While IsEmpty(ActiveCell) = False

If ActiveCell.Value <> s Then
    s = ActiveCell.Value
    ActiveCell.Offset(1, 0).Select
    Windows("Main.xlsm").ActiveCell.Value = s
    Windows("Main.xlsm").ActiveCell.Offset(1, 1).Select


Else
    ActiveCell.Offset(1, 0).Select

End If
Loop

次の行で実行時エラー 1004 が発生します。

Windows("Main.xlsm").ActiveCell.Offset(1, 1).Select

これは、メソッド Select が正しく機能しなかったことを意味します。(「Main.xlsm」は開いていますが、アクティブではなく、セルが選択されています。) 同様の質問を検索したところ、シートを選択していないことが原因である可能性があることがわかりました。しかし、どういうわけかこの行は機能します:

  Windows("Main.xlsm").ActiveCell.Value = s

そして、ワークブック「Main.xlsm」でセルが変更されたことがわかります。Windows("Main.xlsm").ActiveCellしたがって、 Range オブジェクトが作成されると仮定します。

では、なぜエラーが発生するのでしょうか。そして、これを書く正しい方法は何ですか?

また、コードを次のように変更してみました。

    Windows("Main.xlsm").ActiveSheet.ActiveCell.Value = s
    Windows("Main.xlsm").ActiveSheet.ActiveCell.Offset(1, 1).Select

「実行時エラー 438 オブジェクトはこのプロパティまたはメソッドをサポートしていません」。何故ですか?ここで何が間違っていますか?

そして、次のようにします。

 Windows("Main.xlsm").Sheets("Name").ActiveCell.Value = s
 Windows("Main.xlsm").Sheets("Name").ActiveCell.Offset(1, 1).Select

どちらも同じ結果になりました。そして、最後の2つが機能しない理由はまだわかりません。

これは私の最初の投稿です。私の編集やその他の何かが間違っている場合は、私を修正してください。ありがとう!

4

1 に答える 1

1

などを使用ActiveCellするSelectことはお勧めできません。SO Excel タグをブラウズすると、それに反対する多くの回答が見つかります。多くの回答には、その理由がよく説明されています。私の1人については、この質問を参照してください

Range代わりに、変数を宣言しWorksheet、これらを範囲とシートに割り当てます

Dim wbSource as WorkBook
Dim wsSource as WorkSheet

Set wbSource = Application.Workbooks("Main.xlsm")
Set wsSource = wbSource.Worksheets("Name")

VBA が入っているワークブックを使用するには、ThisWorkbookオブジェクトを使用します

アクティブなシートから始めたい場合は、通常はそのままでOK

Dim sh as Worksheet
Set sh = ActiveSheet

範囲を操作するには、次のようなものを使用します

Dim rng as Range

' Set to a specific range
Set rng = Range sh.Range("A1:D10")
' or
With sh
    Set rng = .Range(.Cells(1,1), .Cells(10,4))
End With

' Set to all used cells in a column
With sh
    Set rng = .Range(.Cells(1,1), .Cells(.Rows.Count,1).End(xlUp))
End With

' Adjust rng
Set rng = rng.Offset(1,0)
Set rng = rng.Resize(10,1)

したがって、コードフラグメントをリファクタリングするには

Dim s As String
Dim rng as Range, cl as Range
Dim shSource as Worksheet
Dim rngDestination as Range

Set shSource = Application.Workbooks("Main.xlsm").Worksheets("SheetName")
Set rngDestination = shSource.Range("A1") ' Change to whatever you need here

Set rng = ActiveCell ' if you must!

' Just in case only one cell entry exists, avoid selecting down to bottom of sheet
If Not IsEmpty(rng.Offset(1,0)) Then
    Set rng = Range(rng, rng.End(xlDown)) ' unqualified Range (ie no sh. part) refers to the active sheet
End IF

For Each cl In rng
    If cl.Value <> s Then
        s = cl.Value
        rngDestination.Value = s
        Set rngDestination = rngDestination.Offset(1, 1) ' should this be .Offset(1, 0) ?
    End If
Next
于 2012-09-14T11:11:53.757 に答える