0

これについて投稿した最後のスレッドで非常に役立つアドバイスをたくさんもらいましたが、うまく機能していないので、これについてもう少し助けてもらいたいと思いました.

だから私はこのようなチャートを持っています。左上の値 1 がセル A1 にあるとします。

x=    1    2    3    4    5    6    7    8

      4    3    2    1    2    3    4    5

      9    8    7    6    7    8    9    10

      8    7    6    5    4    3    2    1

Sum= 21   18   15   12   13   14   15    16

行 1 は、1 から 8 までの x 値で構成されます。行 2、3、および 4 は、式で行 1 の x 値を使用した結果の値です。行 5 は、行 2、3、および 4 の合計です。

プログラムで実行する必要があるのは、VBA を使用して、Sum 行の 5 行目を調べ、最小値を検出することです。この場合は 12 になります。次に、その列の x 値を変数 X-Min に割り当てる必要があります。最後に、X-Min の左右の x 値をそれぞれの変数 X-Left と X-Right に割り当てます。

したがって、この例では、合計行を調べて、最小値が 12 であることを見つけます。その列では、行 1 に移動し、値 4 を X-Min に割り当てます。次に、左にオフセットして X-Left = 3 を割り当て、次に右にオフセットして X-Right = 5 を割り当てます。

これは本当に簡単なように思えますが、私は多くの問題を抱えています。

前回の投稿から、合計行で MIN() 関数を使用すると最小値が見つかることがわかりました。MATCH() 関数は、その値がその時の列番号を与えることができます。この時点で、x 値がすべて行 1 にあることがわかっているので、ADDRESS() 関数を使用し、MATCH() 関数の結果を使用して、X-Min に必要な値のアドレスを取得できます。INDIRECT() 関数を使用すると、そのアドレスの値を X-Min に割り当てることができます。

私が抱えている問題がいくつかあります。まず、これを実際に VBA で動作させることができません。データの不一致エラーが発生し続けます。次に、このメソッドを使用して X-Left と X-Right の値を見つけて割り当てる方法がわかりません。アドレス出力を使って左右にオフセットしようと思っていたのですが、やはりデータミスマッチエラーが出てしまいます。

私の主な問題は、この出力を実際に作成する方法がわからないことだと思います。作成したら、必要な方法で出力を使用します。

私は VBA に非常に慣れていないため、多くのことが頭を悩ませ始めています。各パーツが個別に何をするかは理解していますが、それらが合わさってエラーになると、その理由が完全にはわかりません。

たとえば、VBA を使用する前に、これを Excel スプレッドシートで機能させようとしています。入れる:

=CELL(ADDRESS(5,MATCH(MIN(A5:H5),A5:H5,0)))

セルの数式に #VALUE が表示されます。エラー。

私は非常に混乱しており、助けていただければ幸いです!

4

1 に答える 1

2

あなたがこれについて新しい質問を投稿したのを見ました。前のソリューションでの私のコメントに続き、新しいリクエストに対応するために、古いコードを変更してこれを行うことができます

Sub Sample()
    '~~> This will give you the value from row 1 in the same column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(A4:H4,MATCH(MIN(A4:H4),A4:H4,0)))")).Column).Value
    '~~> This will give you the value from row 1 in immediate left column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(A4:H4,MATCH(MIN(A4:H4),A4:H4,0)))")).Column - 1).Value
    '~~> This will give you the value from row 1 in immediate right column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(A4:H4,MATCH(MIN(A4:H4),A4:H4,0)))")).Column + 1).Value
End Sub

ファローアップ

Sub Sample()
    Dim Counter As Long

    Counter = Application.InputBox(Prompt:="Please enter a number", Type:=1)

    If Counter = False Or _
    Counter > ActiveSheet.Rows.Count -2 Then Exit Sub

    '~~> This will give you the value from row 1 in the same column
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(" & Counter + 2 & ":" & Counter + 2 & _
    ",MATCH(MIN(" & Counter + 2 & ":" & Counter + 2 & ")," & Counter + 2 & ":" & Counter + 2 & ",0)))")).Column).Value

    '~~> This will give you the value from row 1 in immediate left column
    '~~> You will have to put an error check here if the current column is 1
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(" & Counter + 2 & ":" & Counter + 2 & _
    ",MATCH(MIN(" & Counter + 2 & ":" & Counter + 2 & ")," & Counter + 2 & ":" & Counter + 2 & ",0)))")).Column - 1).Value

    '~~> This will give you the value from row 1 in immediate right column
    '~~> You will have to put an error check here if the current column is the same as total columns count
    MsgBox Cells(1, Range(Application.Evaluate("=CELL(""address"",INDEX(" & Counter + 2 & ":" & Counter + 2 & _
    ",MATCH(MIN(" & Counter + 2 & ":" & Counter + 2 & ")," & Counter + 2 & ":" & Counter + 2 & ",0)))")).Column + 1).Value
End Sub
于 2012-07-27T15:56:27.087 に答える