2016-11-17 15 views
0

Goodafternoonすべて、現在、「記録マクロ」機能が作業を行いますが、私はそれを再実行しようとすると、それは私に1004エラーが発生しますVBAの問題を、直面 VBAの式が長すぎる、方法は短縮すること

。 私は三つのことを行うことができることを思い出し:

  1. スプリット部分における式まで、次の式では、次の部分を参照してください(つまり、第2部= ABC + DEF + GHIを、その式は123 + 3456 +です____を置き換えて____をパート2に置き換えます)
  2. 数式を異なるセルにテキストとして入力し、数式の中のそれらのセルを参照します(数式はセル( "a1")です。)値(?)+セル( "b2") .VALUE
  3. それは式(すなわちABC =短縮するように、コードの一部に特定の名前を付けて(?)「INPUT - !MOTC」を、次の式でABCに
を参照してください。

特にパート2は、私が正確なリファレンスを知らないので、私はいくつかの助けを借りることができ、VBAに行くのではなく、エクセルの式をいつも振り返ることができます。

ActiveCell.FormulaR1C1 = _ 
    "=IF(WEEKDAY(RC2)=6,COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2)" & _ 
    "+COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+1)" & _ 
    "+COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+2)" & _ 
    ",COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2)" 

は、私が何か間違ったことをやっている、または式は、あまりにも長いです:

式自体はありますか?

(ほとんど背景がありません。土曜日の値をfridayの値に& sundayの値を追加したいので、平日が6の場合は、そうしてください)。事前に

感謝:)

+1

なぜあなたはミックスしましたか?式のR1C1スタイルと一般的なスタイルの両方ですか? – bzimor

+0

VBAを使用して数式をセルに入れるには、R1C1スタイルのみを使用してください。 – bzimor

+0

R1C1スタイルはどういう意味ですか?そして私はそれをどこで使っていないのですか?申し訳ありませんが、比較的新しいこのテーマです。 – Thijsk

答えて

1

あなたは、このように式を短縮することができます:

ActiveCell.FormulaR1C1 = _ 
    "=IF(WEEKDAY(RC2)=6,SUM(COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2+{0,1,2}))" & _ 
    ",COUNTIFS('INPUT - MOTC'!C90,""confirmed"",'INPUT - MOTC'!C101,""1"",'INPUT - MOTC'!C74,""500"",'INPUT - MOTC'!C86,""<>C"",'INPUT - MOTC'!C47,""<""&R2C11,'INPUT - MOTC'!C45,""<""&R2C12,'INPUT - MOTC'!C93,""No"",'INPUT - MOTC'!C105,""No"",'INPUT - MOTC'!C99,""No"",'INPUT - MOTC'!C47,RC2))" 
+0

数式は人間が消化して計算の意図を理解するにはまだ長すぎます。 – ja72

+1

絶対ナンセンス。途中で有能なユーザーはそれを理解できるはずです。 (長さは複雑さと同じではありません)。私は非人道的な意味を見過ごします。 – Rory

+0

これは 'VBA'が生成されているので、ハードコードされた文字列を繰り返してはいけません。何かが動かされたり、名前が変更されたらどうなりますか?これは、これを担当する次の貧しい魂のための地獄です。私はそれがある点としてthedailywtf.comに現れると確信しています。 – ja72

3

この式は完全にunmaintainableです。もう一度やってはいけない!

私は個人的にVBAを使用してセルに式を設定しません。私は常にVBAで計算を行い、結果をセルにのみ提示します。これには、「ライブ」計算ではなく、トリガを必要とする(ボタンプレスのような)不利な点がありますが、維持管理が容易です。

VBAですべての計算を移動することをお勧めします。

  • 個々の入力セルは、あなたが引き出すことができる大きさを知っているよりも、テーブルを持っている場合は​​
  • でVBAに値を引いた範囲

name

  • 命名する必要があります値をVBA配列に格納します。100×7テーブルと例えば

Set r = Range("table_name") 
For i = 1 To n 
    'Find the column with the date 
    d = r.Offset(i - 1, 2).Value2 
    If WorksheetFunction.Weekday(d) Then 
     ' If weekday count items with ... 
     n_confirmed = WorksheetFunction.CountIfs('... 
     n_shipped = WorksheetFunction.CountIfs('... 
    Else 
     ' otherwise count ... 
     n_confirmed = WorksheetFunction.CountIfs('... 
     n_queue = WorksheetFunction.CountIfs('... 
    End If 
    ' Fill the result 
    r.Offset(i - 1, 3).Value2 = n_confirmed + n_shipped + n_queue 
Next i 

Dim table_values() as Variant 
table_values = Range("top_left_cell").Resize(100,7).Value2 
' to loop through values 
For i=1 to 100 
    table_values(i,7) = ... 
Next i 
' Replace the values with new calculated values 
Range("top_left_cell").Resize(100,7).Value2 = table_values 
  • はあなたに複雑な計算をしてくださいは、コメントたとえば

段階に分割しました

関連する問題