-1

私のシートの各行は通貨取引を表しています。各行の最初の 3 つのセルには、通貨、日付、価格が表示されます。その後の各 3 つのセルは、各アカウントが何をしているかを示します。取引は任意の数の口座を持つことができるため、行の長さは異なります。取引 (行) ごとに、通貨、日付、価格、売買、数量、アカウントを示す独自の行を各アカウントに持たせたいと考えています。

**Example**


1          2       3    4   5    6    7    8    9  10  11   12  13
-------------------------------------------------------------------------------

EURUSD  1/1/13   1.30  Buy 100  acc1 Buy 1000 Acc2 Buy 100 acc3 Buy .....
EURUSD  2/1/13   1.31  Buy 1000 acc1 Buy 1000 Acc2 Buy 100 acc3 Buy .....
 .
 .
 .




**WOULD BECOME**

EURUSD  1/1/13   1.30 Buy 100  acc1
EURUSD  1/1/13   1.30 Buy 1000 Acc2
EURUSD  1/1/13   1.30 Buy 100  Acc3
.         .        .
.         .        .
.         .        .
EURUSD  2/1/13   1.31 Buy 1000 acc1
EURUSD  2/1/13   1.31 Buy 1000 acc2
EURUSD  2/1/13   1.31 Buy 100  acc3

私はこれを達成したいいくつかのコード (以下) を書きましたが、そこには無限ループがあると思います。行ごとに、4 列目から開始します。購入または売却の場合

いくつかの変更を試みましたが、同じ問題です。私はそれが私の顔を見つめていると確信していますが、私のエラーを見ることはできません。誰でも修正を提案できますか?ちなみに、それは最も美しいコードではないので、より良い解決策があれば、私はすべて聞いています。ありがとう

Sub changeformat()


Dim p As Integer
Dim r As Integer
Dim c As Integer




p = 150
For r = 1 To 140
c = 4
Range("A" & r).Select

    Do While ActiveCell.Value = """"
         Do Until c = 303
                Cells(r, c).Select
                If InStr(ActiveCell.Value, "Buy") > 0 Or InStr(ActiveCell.Value,"Buy")  > 0 Then

                'The first 3 cells will of each new row will be the same as the first 3 cells
                'of current active 'original' row

                ActiveSheet.Cells(p, 1).Value = ActiveSheet.Cells(r, 1).Value
                ActiveSheet.Cells(p, 2).Value = ActiveSheet.Cells(r, 2).Value
                ActiveSheet.Cells(p, 3).Value = ActiveSheet.Cells(r, 3).Value

                'The active cell and the 2 cells that follow will be pasted to
                'columns D to F in row p

                ActiveSheet.Cells(p, 4).Value = ActiveSheet.Cells(r, c).Value
                ActiveSheet.Cells(p, 5).Value = ActiveSheet.Cells(r, c + 1).Value
                ActiveSheet.Cells(p, 6).Value = ActiveSheet.Cells(r, c + 2).Value


                p = p + 1
                c = c + 3
                End If

        Loop
    Loop
Next r





End Sub

編集

以下の変更を行ったところ、無限ループが止まったようです。現在、想定されていることはほとんど実行されていますが、データが省略されています。たとえば、シートの最初の行には 9 つのセル (2 つのアカウント) しかありません。2 番目には 33 (10 アカウント) があります。これらの 2 行は、12 のアカウントに対して 12 の新しい行に変換されます。残念ながら、各行の最初のアカウントをコピーしているだけです。最初の11行でこれを行い、次に行12と13で機能します。何が起こっているのかについて何か提案はありますか? ありがとう

p = 150
For r = 1 To 140

If Range("A" & r).Value <> "" Then

    'Do While Range("A" & r) <> """"
         For c = 4 To 303
                Cells(r, c).Select
                If ActiveCell.Value <> "" Then
                If InStr(ActiveCell.Value, "Buy") > 0 Or InStr(ActiveCell.Value, "Buy") > 0 Then

                'The first 3 cells will of each new row will be the same as the first 3 cells
                'of current active 'original' row

                ActiveSheet.Cells(p, 1).Value = ActiveSheet.Cells(r, 1).Value
                ActiveSheet.Cells(p, 2).Value = ActiveSheet.Cells(r, 2).Value
                ActiveSheet.Cells(p, 3).Value = ActiveSheet.Cells(r, 3).Value

                'The active cell and the 2 cells that follow will be pasted to
                'columns D to F in row p

                ActiveSheet.Cells(p, 4).Value = ActiveSheet.Cells(r, c).Value
                ActiveSheet.Cells(p, 5).Value = ActiveSheet.Cells(r, c + 1).Value
                ActiveSheet.Cells(p, 6).Value = ActiveSheet.Cells(r, c + 2).Value


                p = p + 1

                End If
                End If

        Next c
    'Loop
    End If
Next r
4

1 に答える 1

1

これからループ条件を変更してみてください

Do While ActiveCell.Value = """"

これに

Do While ActiveCell.Value = "'' ''"

....代わりに、何が起こっているかを自分自身で証明するには、空白のワークブックを開き、すぐにウィンドウを開き (Ctl + G)、これを実行ActiveCell.Value = """"して、セルに何が表示されるかを確認します。

これらVBAのうちの 2 つは'、実際にはこれらの 1 つに等しい文字列です。"

だから多分あなたの条件Do-Loopは決して満たされない.


編集

...データの例では、これを見ることができません""か?


EDIT2

IF必須ではないように見える に気付きました。マクロをステップ実行する方法を知っていますか? これは、このような複雑なループの問題を見つけるための最良の方法です。

  1. 行のすぐ下のマクロの上部にカーソルを置きますSub ...
  2. プレスF8
  3. 最初の行が強調表示さ
    れます。F8 キーを押すたびに 1 行のコードが実行され、ワー​​クシートで何が起こっているかを確認できます。また、IDE の変数の上にカーソルを置くと、それが表示されます。あなたの現在の価値は何ですか。
  4. 数回ループすると、実際のシートが目の前にあるので、おそらく問題が明らかになるでしょう。
  5. 最後まで実行したい場合は、F5 キーを押します。それ以外の場合は、途中で停止できます。
Dim p As Integer
Dim r As Integer
Dim c As Integer

p = 150
For r = 1 To 140

with Excel.Activesheet
If .Range("A" & r) <> "" Then '<<<<<<<.value is the defualt property so no need to include it in code

         For c = 4 To 303
                '.Cells(r, c).Select '<<<<best to aviod using select if you can
                'If .Cells(r, c).Value <> "" Then '<<<<<<<<MAYBE NOT NEEDED
                If InStr(.Cells(r, c), "Buy") > 0 Or InStr(.Cells(r, c), "Buy") > 0 Then  '<<<<<<<<<<<<<<<<<<< WHY ARE YOUR TWO CONDITIONS THE SAME?

                        'The first 3 cells will of each new row will be the same as the first 3 cells
                        'of current active 'original' row

                        .Cells(p, 1) = .Cells(r, 1)
                        .Cells(p, 2) = .Cells(r, 2)
                        .Cells(p, 3) = .Cells(r, 3)

                        'The active cell and the 2 cells that follow will be pasted to
                        'columns D to F in row p

                        .Cells(p, 4) = .Cells(r, c)
                        .Cells(p, 5) = .Cells(r, c + 1)
                        .Cells(p, 6) = .Cells(r, c + 2)

                        p = p + 1

                End If
                'End If
        Next c
    'Loop
    End If
Next r
于 2012-12-14T16:02:55.603 に答える