it-swarm.com.ru

Ошибка выполнения VBA 1004 "Ошибка приложения или объекта" при выборе диапазона

У меня возникла проблема с ошибкой 1004 «Ошибка приложения или объекта» при выборе диапазона. 

Я все еще могу выбирать строки (т.е. Rows("21:21").select) и выбирать диапазоны на других листах той же книги. Я не верю, что ошибка в коде. Может быть, некоторые настройки я не знаю?

Я использовал один и тот же код много раз прежде, но по какой-то причине я не могу заставить его работать в этом подпрограмме (я прокомментировал, где происходит ошибка) ...

Sub CopySheet1_to_PasteSheet2()

    Dim CLastFundRow As Integer
    Dim CFirstBlankRow As Integer

    'Finds last row of content
    Windows("Excel.xlsm").Activate
    Sheets("Sheet1").Activate
    Range("C21").Select
         '>>>Error 1004 "Application-defined or Object-defined error" Occurs
    Selection.End(xlDown).Select
    CLastFundRow = ActiveCell.Row
    'Finds first row without content
    CFirstBlankRow = CLastFundRow + 1

    'Copy Data
    Range("A21:C" & CLastFundRow).Select
    Selection.Copy
    'Paste Data Values
    Sheets("PalTrakExport PortfolioAIdName").Select
    Range("A21").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

    'Bring back to top of sheet for consistancy
    Range("A21").Select
    Range("A1").Select
End Sub

Мне нужно сделать все возможное, чтобы копировать, так как количество строк будет часто меняться. Опять же, приведенный ниже код был использован раньше без ошибок ... но не в этом случае.

Dim CLastFundRow As Integer
Dim CFirstBlankRow As Integer

'Finds last row of content
Windows("Excel.xlsm").Activate
Sheets("Sheet1").Activate
Range("C21").Select
     '>>>Error 1004 "Application-defined or Object-defined error" Occurs
Selection.End(xlDown).Select
CLastFundRow = ActiveCell.Row
'Finds first row without content
CFirstBlankRow = CLastFundRow + 1
16
thomas

Возможно, ваш код находится за Sheet1, поэтому, когда вы меняете фокус на Sheet2, объекты не могут быть найдены? В этом случае может помочь простое указание вашей целевой таблицы:

Sheets("Sheet1").Range("C21").Select

Я не очень знаком с тем, как работает Select, потому что я стараюсь избегать его как можно больше :-). Вы можете определять и управлять диапазонами, не выбирая их. Также это хорошая идея, чтобы быть откровенным обо всем, на что вы ссылаетесь. Таким образом, вы не потеряете свой след, переходя от одного листа или рабочей книги к другому. Попробуй это:

Option Explicit

Sub CopySheet1_to_PasteSheet2()

    Dim CLastFundRow As Integer
    Dim CFirstBlankRow As Integer
    Dim wksSource As Worksheet, wksDest As Worksheet
    Dim rngStart As Range, rngSource As Range, rngDest As Range

    Set wksSource = ActiveWorkbook.Sheets("Sheet1")
    Set wksDest = ActiveWorkbook.Sheets("Sheet2")

    'Finds last row of content
    CLastFundRow = wksSource.Range("C21").End(xlDown).Row
    'Finds first row without content
    CFirstBlankRow = CLastFundRow + 1

    'Copy Data
    Set rngSource = wksSource.Range("A2:C" & CLastFundRow)

    'Paste Data Values
    Set rngDest = wksDest.Range("A21")
    rngSource.Copy
    rngDest.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    'Bring back to top of sheet for consistancy
    wksDest.Range("A1").Select

End Sub
21
Frank H.

Это немного поздно, но может быть полезно для дальнейшего использования. У меня только что была та же проблема, и я думаю, что это потому, что макрос записан на уровне листа. Щелкните правой кнопкой мыши узел модулей в окне проекта VBA, щелкните модуль вставки, затем вставьте макрос в новый модуль (убедитесь, что вы удалили тот, который записан на уровне листа).

Надеюсь, это поможет.

11
Kam

То же самое случилось со мной. В моем случае большая часть листа работала в защищенном режиме (хотя ячейки, относящиеся к макросу, были разблокированы). Когда я отключил защиту на листе, макрос работал нормально ... кажется, что VBA не любит заблокированные ячейки, даже если они не используются макросом.

5
Emily

Некоторые операции в Excel ограничены доступной памятью. Если вы повторяете один и тот же процесс снова и снова, это может привести к переполнению памяти, и Excel больше не сможет его повторять. Это случилось со мной при попытке создать несколько листов в одной книге.

2
Dave

Может появиться сообщение об ошибке «Ошибка времени выполнения 1004», когда вы программно устанавливаете строку большого массива в диапазон в Excel 2003

В Office Excel 2003, когда вы программно устанавливаете значение диапазона с массивом, содержащим большую строку, вы можете получить сообщение об ошибке, подобное следующему:

Ошибка времени выполнения «1004». Ошибка приложения или операции.

Эта проблема может возникнуть, если одна или несколько ячеек в массиве (диапазон ячеек) содержат символьную строку, которая содержит более 911 символов.

Чтобы обойти эту проблему, отредактируйте скрипт так, чтобы ни одна ячейка в массиве не содержала символьную строку, содержащую более 911 символов.

Например, следующая строка кода из приведенного ниже примера блока кода определяет строку символов, которая содержит 912 символов:

Sub XLTest()
Dim aValues(4)

  aValues(0) = "Test1"
  aValues(1) = "Test2"
  aValues(2) = "Test3"

  MsgBox "First the Good range set."
  aValues(3) = String(911, 65)

  Range("A1:D1").Value = aValues

  MsgBox "Now the bad range set."
  aValues(3) = String(912, 66)
  Range("A2:D2").Value = aValues

End Sub

Другие версии Excel или бесплатные альтернативы вроде Calc также должны работать.

2
Cees Timmerman

У меня была похожая проблема, но оказалось, что я просто ссылался на ячейку, которая была со страницы {т.е. ячейки (i, 1). cut ячейки (i-1,2)}

1
WannabeProger

Я мог бы удалить ошибку (ошибка времени выполнения '1004'. Ошибка приложения или операции), определив счетчики как Single

1
Rolf

У меня была похожая проблема, и я исправил ее, выполнив следующие действия:

  1. Снятие защиты листа, который я хочу редактировать
  2. Изменение диапазона, который я выбрал для каждой ячейки в диапазоне (в разобранном виде)

Надеюсь, это кому-нибудь поможет.

1
Fabian

Вы должны перейти на лист базы данных, чтобы получить первую пустую строку, вы можете попробовать этот метод.

Sub DesdeColombia ()    
  Dim LastRowFull As Long

  'Here we will define the first blank row in the column number 1 of sheet number 1:
  LastRowFull = Sheet1.Cells(Rows.Count,1).End(xlUp).Offset(1,0).Row

  'Now we are going to insert information
  Sheet1.Cells(LastRowFull, 1).Value = "We got it"    
End Sub
1
Alex Merlano

У меня была похожая проблема при попытке зацикливаться на каждом листе рабочей книги .. Чтобы решить ее, я сделал что-то вроде этого

dim mySheet as sheet

for each mysheet in myWorkbook.sheets

    mySheet.activate
    activesheet.range("A1").select

    with Selection
    'any wanted operations here
    end with

next

И это работало просто отлично

Я надеюсь, что вы можете адаптировать его в вашей ситуации

0
user6292909

У меня тоже была похожая проблема. После копирования и вставки на лист я хотел, чтобы курсор/выделенная ячейка были A1, а не диапазон, в который я только что вставил.

Dim wkSheet as Worksheet
Set wkSheet = Worksheets(<sheetname>)

wkSheet("A1").Select

но получил ошибку 400, которая была на самом деле ошибка 1004 

Вам нужно активировать лист перед изменением выбранной ячейки Это сработало

Dim wkSheet as Worksheet
Set wkSheet = Worksheets(<sheetname>)

wkSheet.Activate
wkSheet("A1").Select
0
Dave Pile

У меня тоже была такая же проблема, и я чуть не сошел с ума. Решение было довольно неожиданным.

Мой Excel поставляется по умолчанию, и я ввожу формулы в ячейку Excel следующим образом:

=COUNTIF(Range; Searchvalue)
=COUNTIF(A1:A10; 7) 'Example

Обратите внимание, что параметры разделяются точкой с запятой ;. Теперь, если вы вставите именно эту строку в формулу в VBA, например:

Range("C7").FormulaArray = "=COUNTIF(A1:A10; 7)" 'this will not work

Вы получите эту ошибку 1004 без каких-либо объяснений. Я потратил часы на отладку этого. Все, что вам нужно сделать, это заменить точку с запятой на запятую.

Range("C7").FormulaArray = "=COUNTIF(A1:A10, 7)" 'this works
0
Zim84

У меня также та же проблема, и я решил, как показано ниже.
в макросе есть переменная с именем rownumber, и изначально я установил ее как ноль. это ошибка, потому что ни один лист Excel не содержит номер строки как ноль. когда я устанавливаю как 1 и увеличиваю то, что я хочу. 
теперь работает нормально.

0
Singaravelan

Вы можете использовать следующий код (например, если нужно скопировать данные ячейки из Sheet2 в Sheet1).

Sub Copy
Worksheets("Sheet1").Activate                    
Worksheets("Sheet1").Range(Cells(i, 6), Cells(i, FullPathLastColumn)).Copy_
Destination:=Worksheets("Sheet2").Cells(Path2Row, Path2EndColumn + 1)
End Sub
0
parpaei

Я столкнулся с той же проблемой и обнаружил, что у человека, который создал лист, было заблокировано несколько столбцов. Снял защиту и все заработало как задумано.

0
Chris Cooksey

Вам необходимо выяснить действительную причину этого распространенного кода ошибки: 1004. Отредактируйте код вашей функции/VBA и запустите программу в режиме отладки, чтобы определить строку, которая ее вызывает. А затем добавьте ниже кусок кода, чтобы увидеть ошибку,

On Error Resume Next
//Your Line here which causes 1004 error
If Err.Number > 0 Then
  Debug.Print Err.Number & ":" & Err.Description
End If

Примечание: Отладка горячих клавиш, которые я использую на ПК: Step Into (F8), Step Over (Shift + F8), Step Out (Ctrl + Shift + F8) 

0
Bhuvanesh Mani