0

シート入力から列 E と K を選択し、最後に使用した行Working sheetの後に処理して貼り付けようとしています。Output sheet最後に使用した行番号を x に保存し、値を x+1 セルに貼り付けました。ただし、Excel はシートの最後の行 (x は 65536) を選択し、実行時エラー 4004 を返します。

Dim x As Long, y As String
    Sheets("Input").Activate
    Range("E:E,K:K").Select
    Range("K1").Activate
    Selection.Copy
    Sheets("Working").Select
    Cells(1, 1).Select
    ActiveSheet.Paste
    Cells.Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    Range("B5").Select
    ActiveSheet.Range("$A$1:$H$30").AutoFilter Field:=1, Criteria1:="="
    Cells.Select
    Selection.Delete Shift:=xlUp
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
    Range("B2").Select
    ActiveCell.FormulaR1C1 = _
        "=IF(RC[-1]="""","""",VLOOKUP(RC[-1],Repository!C[-1]:C[1],3,0))"
    Range("B2").Select
    Selection.Copy
    Range("B3:B30").Select
    ActiveSheet.Paste
    Cells.Select
    Application.CutCopyMode = False
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("B2:C2").Select
    Range(Selection, Selection.End(xlDown)).Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Output").Select
    Range("A1").Select
    x = Worksheets("Output").UsedRange.Rows.Count
    y = "a" & Trim(x + 1)
    ActiveSheet("Output").Range(y).Select
    ActiveSheet.Paste
4

5 に答える 5

1

UsedRange はまだ最後の行が 65536 であると考えています。このサブルーチンを追加し、x を設定する直前に呼び出します。

Sub CorrectUsedRange()
Dim values
Dim usedRangeAddress As String
Dim r As Range
'Get UsedRange Address prior to deleting Range
usedRangeAddress = ActiveSheet.UsedRange.Address
'Store values of cells to array.
values = ActiveSheet.UsedRange
'Delete all cells in the sheet
ActiveSheet.Cells.Delete
'Restore values to their initial locations
Range(usedRangeAddress) = values
End Sub
于 2013-09-10T14:54:34.493 に答える
0

使用された範囲の代わりに、このコードですでに埋められている行数を確認します。

X = WorksheetFunction.CountA(列(1))

もちろん、これは、列 A に空の行がない場合にのみ正常に機能します。これらの行は無視されるためです!

于 2013-09-11T15:20:51.563 に答える
0

Find ループを使用して配列にデータを入力し、マクロが完了したら配列を出力します。「Working」シートは必要ありません。Cells(Rows.Count, "A").End(xlUp)これは、信頼できない可能性がある代わりに、最後に入力された行を見つけるためにも使用しUsedRange.Rows.Countます。

Sub tgr()

    Dim rngFound As Range
    Dim rngLookup As Range
    Dim arrResults() As Variant
    Dim ResultIndex As Long
    Dim strFirst As String

    With Sheets("Input").Columns("E")
        Set rngFound = .Find("*", .Cells(.Cells.Count), xlValues, xlWhole)
        If Not rngFound Is Nothing Then
            strFirst = rngFound.Address
            ReDim arrResults(1 To WorksheetFunction.CountA(.Cells), 1 To 2)
            Do
                If rngFound.Row > 1 Then
                    ResultIndex = ResultIndex + 1
                    On Error Resume Next    'Just in case the VLookup can't find the value on the 'Repository' sheet
                    arrResults(ResultIndex, 1) = Evaluate("VLOOKUP(""" & rngFound.Value & """,Repository!A:C,3,FALSE)")
                    arrResults(ResultIndex, 2) = .Parent.Cells(rngFound.Row, "K").Value
                    On Error GoTo 0         'Remove the On Error Resume Next condition
                End If
                Set rngFound = .Find("*", rngFound, xlValues, xlWhole)
            Loop While rngFound.Address <> strFirst
        End If
    End With

    If ResultIndex > 0 Then Sheets("Output").Cells(Rows.Count, "A").End(xlUp).Offset(1).Resize(ResultIndex, UBound(arrResults, 2)).Value = arrResults

    Set rngFound = Nothing
    Erase arrResults

End Sub
于 2013-09-10T15:26:34.487 に答える
0

コードの下部付近を次のように置き換えます。

Sheets("Output").Select

と:

Sheets("Output").Select
ActiveSheet.UsedRange

これは、UsedRange を「再設定」する必要があります。

于 2013-09-10T14:01:12.360 に答える
0

使用範囲が一般的に大きくなり、それ自体ではリセットされないことがあります。これが発生した場合、それを強制的に正しくリセットする唯一の方法は、対象のワークシートが含まれているワークブックを保存することです。これは、とにかく Excel 2010 で機能します。.Selectandを使用しているためActive<obj>(これはお勧めしません)、単純に次のようになります。

ActiveWorkbook.Save
于 2013-09-10T15:04:13.750 に答える