2017-11-16 3 views
0

I got help last week構文と範囲が正しく、私はちょうどそれを完了するためにvlookupを行うことができると思ったが、明らかに私は間違っていた。これを達成する方法を研究しようとすると、様々な例が見つかるようですが、私のコードに翻訳する背景はありません。VBAに値として数式結果を挿入する方法

マクロが実行され、がほぼとなります。しかし、配列を挿入することに加えて、私の 'sourcerng'に空のセルがあるときに値を必要とする3つの他のセルがあります。

Snip of my worksheet

これは、値を(値は私のワークシートに既にある、私はこれらの空白のセルにそれらを取得する必要があります)必要があるセルのためのロジックです。私はこれらのためにIIFの声明をしようとしたが、私はまだ何をやっているのか分からない。それが最善の方法だろうか?別のIF THENステートメントでなければなりませんか?

rngBE- 列Z = 0は、次にカラムの行に対応するから値をコピーする場合O.は、そうでない場合、カラムZから値をコピー

rngBG - 列AAは "不明" は、行に対応するから値をコピー= IFそれ以外の場合は列AAから値をコピーします。

rngBK - IF列AB = "不明"列Nの対応する行の値をコピーします。それ以外の場合は列ABの値をコピーします。

Sub AutomateAllTheThings6() 
Dim arr3() As String 
Dim arr11() As String 
'Dim resBE As String 
Dim rng3 As Range 
Dim rng11 As Range 
Dim rngBE As Range 
Dim rngBG As Range 
Dim rngBK As Range 
Dim sourcerng As Range 
'Dim firstRow As Long 
Dim lastRow As Long 
'Dim i As Long 

    Call OptimizeCode_Begin 
     'firstRow = 2 
     lastRow = ActiveSheet.Range("D1").End(xlDown).Row 
     Set rng3 = ActiveSheet.Range("BH2:BJ" & lastRow) 
     Set rng11 = ActiveSheet.Range("BL2:BV" & lastRow) 
     Set rngBE = ActiveSheet.Range("BE2:BE" & lastRow) 
     Set rngBG = ActiveSheet.Range("BG2:BG" & lastRow) 
     Set rngBK = ActiveSheet.Range("BK2:BK" & lastRow) 
     Set sourcerng = ActiveSheet.Range("BE2:BE" & lastRow) 
     arr3() = Split("UNKNOWN,UNKNOWN,UNKNOWN", ",") 
     arr11() = Split("UNKNOWN,UNKNOWN,UNKNOWN,UNKNOWN,UNKNOWN,UNKNOWN,00/00/0000, _ 
         00/00/0000,00/00/0000,00/00/0000,NEEDS REVIEW", ",") 
      For Each cell In sourcerng 
       If IsEmpty(cell) Then 
        Intersect(rng3, ActiveSheet.Rows(cell.Row)).Value = arr3 
        Intersect(rng11, ActiveSheet.Rows(cell.Row)).Value = arr11 
        '***PLS HELP*** 
        Intersect(rngBE, ActiveSheet.Rows(cell.Row)).Value = "WEEEEE" 
        Intersect(rngBG, ActiveSheet.Rows(cell.Row)).Value = "WOOOOO" 
        Intersect(rngBK, ActiveSheet.Rows(cell.Row)).Value = "WAAAAA" 
       End If 
      Next 
     Range("BR2:BU2").Select 
      Range(Selection, Selection.End(xlDown)).Select 
      Selection.NumberFormat = "mm/dd/yyyy" 
     Columns("BF:BF").Select 
     Selection.Delete Shift:=xlToLeft 
    Call OptimizeCode_End 
End Sub 


'*********TESTING*********** 
'resBE  = IIf(Cells(13,Z).Value = 0, Cells(13,BE).Value = Cells(13,Z), Cells(13,BE).Value = Cells(13,O)) 

'*************************************** 
'For i = firstRow To lastRow 
'   valZ = Range("Z" & i) 
'   valOh = Range("O" & i) 
'   
'   If valZ = 0 Then 
'    rngBE.Value = valOh 
'    Else rngBE.Value = valZ 
'   End If 
+1

範囲BEには、incell formulaがありますか? = if(Z2 = 0、O2、Z2) – mooseman

+0

私は実際にこれを「自動化」しています。これは他の「技術的でない」人々が最終的にこれを実行するためです。私は私が困惑したときにそれを最初に試しましたが、空白のセルを持つ行がランダムに散在するので、式を書き込むことができません。私が使用しているテストデータには4kの行がありますが、これが適用されるのは300ishの行だけです。 – pnwAnalyst

+0

VBAの場合、range()。formula = "= if(Z2 = 0、O2、Z2)"を使用して、正しい行番号を入れることができます。または、range()。value =をif(Z2 = 0、O2、Z2)ロジックの結果にすることができます。 – mooseman

答えて

0

タスクを実行する方法はいくつかあります。あなたがVBAよりも "Excel"の方が多い場合は、この方法を検討することができます。R1C1形式の「通常の」数式の構文を注入できます。

だから=if($Z2=0,$O2,$Z2)上記式は、行2 の任意の値のため.FORMULA形式であるが、.FORMULAR1C1に、それはのような任意のセルに挿入することができる。=IF(RC26=0,RC15,RC26)(基本的にない行上または下に、しかし常に列O(15)とZ(26)

だから、あなたの修正コードはこのようなものだろう:。

Intersect(rngBE, ActiveSheet.Rows(cell.Row)).FormulaR1C1 = "=IF(RC26=0,RC15,RC26)" 
Intersect(rngBE, ActiveSheet.Rows(cell.Row)).Value = _ 
Intersect(rngBE, ActiveSheet.Rows(cell.Row)).Value 

繰り返しますが、これはあなたのタスクを達成するための最も効率的な方法ではありませんが、しかし、あなたはthousandsof行を扱っている場合、数十から数十万に対して、私はそれを心配する必要はなく、新しいツールを使用することができます。

+1

私は本当にSQLの人です。しかし、それは間違いなく私が探していたものです。ありがとうございました! そして、私は9k行以上のレポートを見ていません。再度、感謝します! – pnwAnalyst

+0

喜んで助けてください。あなたの全体的な問題は、空文字関数に関連するものに対して評価される条件文を取得する方法であるため、より自由になるように投稿のタイトルを変更することができます。私は、「VBAに式の結果を値として挿入させる方法」を提案するかもしれません。コミュニティにとってより有益な貢献をするアイデア。それにもかかわらず、それはうまく働いて、チェックのおかげでうれしい。 – PGCodeRider

関連する問題