2

タクトを変えることにしました。私はこれで別のショットを撮ることに決めましたが、新しい方法で。私は週末に長いGoogleマラソンをしましたが、自分の答えを信じていることがわかりました。

Option Explicit
Sub DataUpdate()
Dim rFind As Long, NR As Long, LR As Long, LC As Long
LR = Range("C" & Rows.Count).End(xlUp).Row
LC = Cells(2, Columns.Count).End(xlToLeft).Column
NR = LR + 1

On Error Resume Next
rFind = Range("A25:A" & LR).Find(Range("A1")).Row
On Error GoTo 0

    If rFind = 0 Then
        If MsgBox("Customer record not found, add to dataset?", vbYesNo + vbQuestion) = vbYes Then
            Range("A2", Cells(LC, 2)).Copy
            Range("C" & NR).PasteSpecial xlPasteValues
            Range("A1", Cells(1, LC)).ClearContents
            Exit Sub
        End If
    Else
        Range("A2", Cells(2, LC)).Copy
        Range("A" & rFind).PasteSpecial xlPasteValues
        Range("A1", Cells(1, LC)).ClearContents
    End If
End Sub

これを見て、私はそれをそのまま受け止めて、私が何をしているのかを知らずにそれを使用するのではなく、より明確な説明が欲しいだけです。

これがその上にあるシートです:

http://dl.dropbox.com/u/3327208/Excel/Replace.zip

これをコードに追加したら、このコードを逆流させてください。これができると思います。これが正しいことを確認したいだけです。

Option Explicit

Sub PENCMR()
    Dim i As Integer

    With Application
        .ScreenUpdating = False
    End With

    'Internal NCMR
    Dim wsPE As Worksheet
    Dim wsNDA As Worksheet

    'Copy Ranges
    Dim c As Variant

    'Paste Ranges
    Dim p As Range

    'Setting Sheet
    Set wsPE = Sheets("Print-Edit NCMR")
    Set wsNDA = Sheets("NCMR Data")
    Set p = wsPE.Range("A54:U54")

    With wsPE
        c = Array(.Range("AG2"), .Range("B11"), .Range("B14"), .Range("B17"), .Range("B20"), .Range("B23") _
                , .Range("Q11"), .Range("Q14"), .Range("Q17"), .Range("Q20"), .Range("R25"), .Range("V23") _
                , .Range("V25"), .Range("V27"), .Range("B32"), .Range("B36"), .Range("B40"), .Range("B44") _
                , .Range("D49"), .Range("L49"), .Range("V49"))
    End With

    For i = LBound(c) To UBound(c)
        p(i + 1).Value = c(i).Value
    Next

    With wsNDA
        Dim rFind As Long, NR As Long, LR As Long, LC As Long
        LR = Range("C" & Rows.Count).End(xlUp).Row
        LC = Cells(2, Columns.Count).End(xlToLeft).Column
        NR = LR + 1
        rFind = wsNDA.Range("A:A" & LR).Find(Range("A54")).Row

        Range("A54", Cells(2, LC)).Copy
        Range("A" & rFind).PasteSpecial xlPasteValues
        Range("A54", Cells(1, LC)).ClearContents

    End With

    With Application
        .ScreenUpdating = True
    End With
End Sub

コードは実行されますが、エラーが返されませんが、完全には実行されません。それはすべてを引きずり下ろすところまで到達し、そこで死んでいるように見えます。行をコピーし、列Aで番号を検索し、行54に正しいデータを上書きするという、私が考えていることを実行しない理由を誰かが見つけてくれるでしょうか...

私は何かが間違っていることを知っていますが、誰かが私を助けてくれるなら、それを理解するスキルがありません。

4

1 に答える 1

0

私はあなたが何を達成しようとしているのか100%確信していませんが、あなたのコードにはいくつかの問題があります:

それ以外の

Set p = wsPE.Range("A54:U54")
For i = LBound(c) To UBound(c)
    p(i + 1).Value = c(i).Value
Next

あなたはおそらく意味します

Set p = wsPE.Range("A54")
For i = LBound(c) To UBound(c)
    p.Offset(0, i) = c(i)
Next

ブロックでは、 andの前With wsNDAに置く必要があります。例:.RangeCells

.Range("A54", .Cells(2, LC)).Copy

ついに:

  • 今のところステートメントを削除しScreenUpdating、デバッグモード(F8)でコードを実行して、コードの動作を段階的に確認し、必要に応じて「ウォッチの追加」を使用して変数の値を確認します。
  • 一時データを格納するために範囲を使用することは避けます。代わりに、次のように2D配列を使用できます。

Dim data As Variant
Redim data(1 To 1, 1 To 21) As Variant
for i = xx To yy
    data(1,i+1) = c(i)
Next i

yourTargetCell.Resize(1, UBound(data,2)) = data
于 2012-05-01T13:46:43.073 に答える