Сброс массива вариантов в диапазон - ошибка VBA excel 1004

Я использую vba для Excel, чтобы сохранить данные в массив с помощью:

Dim allPosts As Variant
allPosts = Range("A2:J5000")

после этого я меняю данные в массиве allPosts, а затем хочу вставить их обратно:

Range("A2:J5000").Value = allPosts

Я получаю сообщение об ошибке:

ошибка времени выполнения 1004, определяемая приложением или объектом

и копирование останавливается на определенной ячейке, когда я изменяю строку в этой ячейке на более короткую, проблема решается.

Спасибо


person Presen    schedule 01.12.2012    source источник
comment
Отправьте все, что у вас есть. Не знаю, как у других, но у меня нет под рукой хрустального шара.   -  person ApplePie    schedule 02.12.2012
comment
изменения, которые я выполняю в массиве allPosts, сложны, поэтому встроенный макрорекордер не помог   -  person Presen    schedule 02.12.2012
comment
ну, используйте диктофон, чтобы увидеть, как работает функция вставки; адаптируйте его к вашим потребностям   -  person Andrew    schedule 02.12.2012
comment
функция вставки работает, только когда она достигает очень длинной строковой ячейки, происходит сбой. Спасибо!   -  person Presen    schedule 02.12.2012
comment
Вы пытались просто перебрать свой массив и вставить его в ячейки назначения по одному? http://msdn.microsoft.com/en-us/library/office/aa221353(v=office.11).aspx   -  person Andrew    schedule 02.12.2012
comment
@ Эндрю, средство записи макросов полезно для базовой имитации ручных действий - использование вариантных массивов - это метод программирования, не имеющий ручного эквивалента.   -  person brettdj    schedule 02.12.2012


Ответы (1)


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

Из этой статьи службы поддержки Microsoft excel-2003 не может обработать запись строк массива длиннее 911 символов excel-2010 отлично работал при моем тестировании)

Код ниже:

  1. Устанавливает основной массив вариантов, который читается в диапазоне
  2. Устанавливает второй пустой вариант того же размера, что и первый массив
  3. Tests each part of the array for cell length of more than 911 characters and then either
    • manipulates the shorter value in the first array, or,
    • удаляет значение из первого массива, а затем записывает его во второй массив
  4. Первый массив одним выстрелом сбрасывается обратно в диапазон
  5. Второй массив повторяется ячейка за ячейкой, чтобы сбросить другие строки.

код

    Sub KudosRickyPonting()
    Dim allPosts As Variant
    Dim allPosts2 As Variant
    Dim vStrs As Variant
    Dim lngRow As Long
    Dim lngCol As Long
    allPosts = Range("A2:J5000").Value2
    ReDim allPosts2(1 To UBound(allPosts, 1), 1 To UBound(allPosts, 2))

    For lngRow = 1 To UBound(allPosts, 1)
        For lngCol = 1 To UBound(allPosts, 2)
            If Len(allPosts(lngRow, lngCol)) < 912 Then
                allPosts(lngRow, lngCol) = "Updated:" & allPosts(lngRow, lngCol)
            Else
                allPosts2(lngRow, lngCol) = "NEW PART " & allPosts(lngRow, lngCol)
                'erase long value from first array
                allPosts(lngRow, lngCol) = vbNullString
            End If
        Next
    Next
    Range("A2:J5000").Value = allPosts

    For lngRow = 1 To UBound(allPosts2, 1)
        For lngCol = 1 To UBound(allPosts2, 2)
            If Len(allPosts2(lngRow, lngCol)) > 0 Then Range("A2").Offset(lngRow - 1, lngCol - 1).Value2 = allPosts2(lngRow, lngCol)
        Next
    Next
    End Sub
person brettdj    schedule 02.12.2012
comment
Спасибо!!! есть ли способ нарезать строки длиннее 911? Таким образом, я буду нормально работать со всеми сообщениями, когда появится длинная строка, я нарежу ее и, наконец, вставлю все сообщения обратно на лист, как обычно: Range (A2: J5000). Value = allPosts - person Presen; 02.12.2012
comment
Согласен с Дугом... Очень красиво :) - person Siddharth Rout; 26.04.2013
comment
Uped for KudosRickyPonting - person dilbert; 08.08.2013