5

次の方法でデータを配列に保存するために、 for Excelを使用しています。

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

その後、配列内のデータを変更してから、次のallPosts方法で貼り付けたいと思います。

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

エラーが発生します:

実行時エラー 1004 アプリケーション定義またはオブジェクト定義

コピーは特定のセルで停止します。このセルの文字列を短く変更すると、問題は解決します。

ありがとう

4

1 に答える 1

12

2 番目の配列を使用して、長すぎるセルの長さを格納し、これらを個別に反復処理できます。

このマイクロソフトのサポート記事 から、 911文字より長い配列文字列を書き戻すことができませんは私のテストでは問題なく動作しました)

以下のコード:

  1. 範囲を読み取る主要なバリアント配列を設定します
  2. 最初の配列と同じサイズの 2 番目の空白バリアントを設定します
  3. 配列の各部分のセルの長さが 911 文字を超えているかどうかをテストし、次のいずれかを行います。
    • 最初の配列の短い方の値を操作する、または、
    • 最初の配列から値を削除し、それを 2 番目の配列に書き込みます
  4. 最初の配列は、範囲に戻るシングルショットでダンプされます
  5. 2 番目の配列はセルごとに反復され、他の文字列をダンプします。

コード

    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
于 2012-12-02T00:49:20.373 に答える