6

非常に反復的なタスクを実行するマクロを書きたいと思っていましたが、VBA に入るのが予想以上に困難です。Excel のマクロのプログラミング方法は非常に役立つので、時間があるときに学習しますが、今週は 5 時間から 12 時間を費やすことはできません。

ここにいる誰かが助けてくれるかもしれません!

このパターンに従ういくつかの Excel ファイルがあります。

Column C - Column D
--------------------
text     | (empty)
number   | (empty)
number   | (empty)
text     | (empty)
number   | (empty)
text     | (empty)
text     | (empty)
number   | (empty)
text     | (empty)
number   | (empty)

数千のセルでテキストと数字がランダムに交互に表示されます。列 C が数値の場合、前の数値との差を保持する列 D が必要です。それ以外の場合は、空白のままにする必要があります。

Column C - Column D
--------------------
text     | (empty)
3        | (empty)
14       | (=C3-C2) : 11
text     | (empty)
16       | (=C5-C3) : 2
text     | (empty)
text     | (empty)
21       | (=C8-C5) : 5
22       | (=C9-C8) : 1

したがって、アルゴリズムは次のとおりです。

var previousNumberCell
var i = 1

for all (selected) cells/rows 
 if (Row(i).column(C) holds number) {
   Row(i).column(D).value = "=C"+i+"-"C"+previousNumberCell
   previousNumberCell = i;
 }
 i++

End

最初または最後のセルが機能しないかどうかは気にしません。

助けてくれてありがとう、またはこれに対する答えを見つけることができる場所を教えてください。

編集: これは問題の簡略化されたバージョンです。Excel マクロでうまくいく方法がわからないことが 2 つあります。セルを選択し、セルが数値であるかどうかを確認してください。テキスト形式から数値形式へ。

4

3 に答える 3

13

これを試してみてください:

Sub MyMacro()
Dim rng as Range
Dim cl as Range
Dim lastNum as Range
Set rng = Range(Selection.Address) 'Make sure that your active SELECTION is correct before running the macro'

If Not rng.Columns.Count = 1 Then
    MsgBox "Please select only 1 column of data at a time.",vbCritical
    Exit SUb
Else:
    For each cl in rng
        If IsNumeric(cl.Value) Then
            If lastNum Is Nothing Then
                cl.Offset(0,1).Formula = "=" & cl.Address
            Else:
                cl.Offset(0,1).Formula = "=" & cl.Address & "-" & lastNum.Address

            End If
            set lastNum = cl
        End If
    Next
End If

End Sub
于 2013-04-03T11:49:21.137 に答える
-1

こんにちは、 if 式と名前付き式でこれを行うことができます。if (isnumber ,名前付き式,0)

名前付き式 (=ルックアップ式)

于 2015-02-13T14:03:23.730 に答える