2017-09-15 3 views
-1

単一のエクセル式を書くのに何時間も費やしましたが、無駄です。私はちょうど代わりにVBAマクロを書くことに決めましたが、VBAの経験はほとんどなく、他の(似ていますが、かなり似ていません)答えを私のニーズに適応させるのに問題があります。VBA Excel - 文字列の検索、対応する値の合計、複数のシートにわたる変数の場所、変数の集計で小計を集計する

在庫の注文にはテンプレートブックがあり、各ページに小計があります。合計金額(各シートの小計の合計)を出力するために概要シートが必要です。簡単なテストワークブックが添付されています。これは、形式は次のとおりです。

Sheet1の

列[LOCATION1のUNKNOWN] |次の列

StringOfInterest 。 。 。 。 。 。 。 。 。 。 。 。 。 。 | Value_1

シート2

カラム[LOCATION2 UNKNOWN] |次の列

StringOfInterest 。 。 。 。 。 。 。 。 。 。 。 。 。 。 |値2

...

要約シート

列N |列N = 1

StringOfInterest | Value_1 + Value_2 + ... + Value_m

注:実際のシートの数は変更され、StringOfInterestは実際には1行2列幅のマージされたセルにあります。

制約: StringOfInterest "小計"とそれに対応する隣接列の値を含むセルは、各シート間の任意の場所にあります。 "小計"文字列は、実際には1つのセルにマージされた2つの隣接する列セルに配置されます。 (1)必要に応じて新しいシートを追加する、(2)要約シートに目的の合計を入力することを除いて、シート自体を編集することはできません。 これは、新しい在庫シートの追加、古い在庫シートの削除、シート名の変更、および任意のシート上の小計の位置の変更に対して堅牢である必要があります。

文字列 "小計"をすべてのシートに一致させ、マッチした各セルを1つの列(おそらく2つ、Excelがマージされたセルを処理する方法に応じて2つ)分オフセットし、それらの値を合計します。

私はSUM(IF())、SUMIF()、SUMIFS()、SUMPRODUCT()、INDIRECT()、MATCH()、VLOOKUP()、OFFSET()などのさまざまな組み合わせを使用しようとしました。 。無駄に。現時点では、上司にこの計算を実行するマクロを与えて、要約ページの定義されたセルに合計を出力するだけで構いません。

私は必要なものを明示的に示す簡単なワークブックを用意しました。Summaryという名前のシート7には、関心のある文字列名のセルと、合計を出力する場所があります。必要に応じて、この単純なワークブックでは、セルを検索文字列と同じにすることを避けるために、[サマリー]ページを変更することができます(たとえば、 "小計"の代わりに "小計サマリー" ...または "こんにちは"の代わりに " )、プレースホルダのページを追加することもできます(ただし、毎回強制的に編集することなく、上記の潜在的な変更に対応できる必要があります)

ありがとうございました!

(注意:Office 365のためにExcelを使用)

EDIT:シートをGoogleにアップロードされたファイルスタックオーバーフローは、添付ファイルをサポートしていませんので、:https://docs.google.com/spreadsheets/d/1RGpQ-4KSYYuwbpWGb0DPAI6qhxLQ0d4CqLwW2gOns2A/edit?usp=sharing

答えて

0

あなたはインデックス()マッチ()を使用してみました組み合わせ式。

http://www.randomwok.com/excel/how-to-use-index-match/

それはあなたが探している何をすべきスニペットこのコードを試してみてください。

Dim ws As Worksheet 
Dim myArr() As Variant 
Dim rng As Range 

'Finds all the cells where "Hello" is found and stores them in an array 
ReDim myArr(0) 
For Each ws In ActiveWorkbook.Worksheets 

    With ws.Cells 
     Set rng = .Find(What:="Hello", LookIn:=xlValues, LookAt:=xlPart _ 
     , SearchOrder:=xlByRows, SearchDirection:=xlNext) 
     If Not rng Is Nothing Then 
      myArr(UBound(myArr)) = rng.Offset(0, 1).Value 
      ReDim Preserve myArr(UBound(myArr) + 1) 
     End If 
    End With 

Next 

'loop through array to sum everything up 
For i = 0 To UBound(myArr) 
    'do math 
Next 
+0

はい:私はにより、手動(「ハロー合計」に「こんにちは」からページ7のrow2col1上のエントリを変更した後)は、ページ7の私の「合計」欄に結果を挿入することを決めました。私の主なコードでは、 'SUM(OFFSET(INDEX(FirstPageName:LastPageName!1:1048576、MATCH(" Subtotal "、1:1048576,0))、0,1,1,1))';結果はVALUEエラーです。「エラートレーサには、既存の矢印または循環参照があります。すべてのトレーサ矢印を削除するか、循環参照を解決してから、再度トレースエラーを選択してください。 –

+0

あなたは次のようなものを試すことができます:https://www.rondebruin.nl/win/s9/win006.htm –

+0

素晴らしい!どうもありがとうございます!!もしVBAスーパーnoobがこれを見つけたら、Dim文の前に 'Public Sub Arbitrary_Name_Of_Macro()'で始まり、最後の行に 'End Sub'で終わることを忘れないでください。私は手動でページ7のrow2col1の項目を "hello"から "hello total"に変更した後に、ページ7の "Total"列に結果を手動で挿入することにしました: 'Dim iRow As Integer、iCol As Integer ... iRow = 2 iCol = 2 セル(iRow、iCol)。値= myArr_Tot' –

0

R.卵は非常に簡単なVBAマクロで、私の問題に最適なソリューションを与えました! 、任意のVBA超初心者がこれを見つけた場合は、薄暗い文の前に Public Sub Arbitrary_Name_Of_Macro() を開始することを忘れないでください

...私はその答えにコメントをしたが、これは将来のスタックの概要の潜伏者のためのより多くの目に見えるかもしれ最後の行は End Sub で終了します。

Dim iRow As Integer, iCol As Integer ... iRow = 2 iCol = 2 Cells(iRow, iCol).Value = myArr_Tot

関連する問題