2017-09-18 42 views
0

我是我的項目中的一個點,我需要將FORUMula添加到電子表格中的各個列(範圍)。第一個在單元格中獲取一個值,並返回另一個值。這應該是整個列的相同值。將包含嵌套IF的公式添加到範圍不起作用

我嘗試使用實際的公式,它與IF的問題。雖然這是如何在Excel中陳述並且工作正常,但當我嘗試使用VBA添加它時,它與該語句和=符號有關。

因此,我嘗試了一種不同的方法,因爲它需要查找和比較的初始值是組合框的結果。在前面的步驟中,我將這個值放在了我從中獲取初始值的列中。這是報告正在更新的月份。我試圖實現的是它運行的最後一個月的價值。

例如,如果初始單元格的值爲「12月」,則上一個月將爲「11月」,並且這是將放入同一行內指定單元格的結果。我也無法讓這個工作。它沒有錯誤,它只是通過它而已。

我打算把下面的公式放在AN2到lRowB的範圍內(這是另一個變量的最後一行) - 或者 - 在宏本身使用一個變量(方法2)。無論什麼最有意義,表現最好。此表有超過20K條目。

其計算公式爲:

=IF([@[Current Update Month]]="January", "December", IF([@[Current Update Month]]="February", "January", IF([@[Current Update Month]]="March", "February", IF([@[Current Update Month]]="April", "March", IF([@[Current Update Month]]="May", "April", IF([@[Current Update Month]]="June", "May", IF([@[Current Update Month]]="July", "June", IF([@[Current Update Month]]="August", "July", IF([@[Current Update Month]]="September", "August", IF([@[Current Update Month]]="October", "September", IF([@[Current Update Month]]="November", "October", IF([@[Current Update Month]]="December", "November", 0))))))))))))

另一種方法是我最後一次用我的代碼。

這是一段代碼。

Dim lastMonthUpdate As String 
Dim lastUpdateMonRng As Range 

Set lastUpdateMonRng = sht.Range("AN2" & lRowB) 
'LRowB is defined in a previous step. The value is this: lRowB = sht.Cells(Rows.Count, 1).End(xlUp).Row - it did not need restating 

If ABCMatrixMonthSelect.ComboBox1.value = "January" Then 
    lastMonthUpdate = "December" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "February" Then lastMonthUpdate = "January" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "March" Then lastMonthUpdate = "February" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "April" Then lastMonthUpdate = "March" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "May" Then lastMonthUpdate = "April" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "June" Then lastMonthUpdate = "May" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "July" Then lastMonthUpdate = "June" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "August" Then lastMonthUpdate = "July" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "September" Then lastMonthUpdate = "August" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "November" Then lastMonthUpdate = "September" 
    ElseIf ABCMatrixMonthSelect.ComboBox1.value = "December" Then lastMonthUpdate = "November" 

End If 
With lastUpdateMonRng = lastMonthUpdate 
End With 
+0

我是在總結你的問題這樣解決:我需要一個公式,將取代一個月的名稱與前一個月? –

+0

這不是替代。它查看包含更新月份的單元格中的值,該值也是ABCMatrixSelect.ComboBox1.value的結果,並將前一個月的名稱放在AN列中。它不會替換原始內容,它會查看一個單元格值並確定值。或者..它可以使用ABCMatrixSelect.Combox1.value本身。這兩種方法都會得到相同的結果。 – SharePoint0508

+0

對不起,有點不清楚。我的意思正是你說的。但是你需要這個在VBA宏中?像查找/索引+匹配這樣的感覺可以做到這一點,而不必去VBA。 –

回答

0

我會使用宏觀方法。宏在處理多個條件語句方面要好得多。您可以通過事件調用宏,您可以使用宏在Excel中創建自定義公式,或者您可以在需要時手動調用宏。下面是如何獲得在VBA中工作的多個條件的主要部分。

在VBA中,每個If語句都需要以End If語句結尾。相反,創建多個If語句,使用Else If放了多個條件到同一If statment

If ABCMatrixMonthSelect.ComboBox1.value = "January" Then 
     lastMonthUpdate = "December" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "February" Then lastMonthUpdate = "January" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "March" Then lastMonthUpdate = "February" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "April" Then lastMonthUpdate = "March" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "May" Then lastMonthUpdate = "April" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "June" Then lastMonthUpdate = "May" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "July" Then lastMonthUpdate = "June" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "August" Then lastMonthUpdate = "July" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "September" Then lastMonthUpdate = "August" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "November" Then lastMonthUpdate = "September" 
     ElseIF ABCMatrixMonthSelect.ComboBox1.value = "December" Then lastMonthUpdate = "November" 

    End If 
+0

是的!我沒有忘記這一點。我最近一直在使用Select和Case,但這不是需要選擇的東西,而完全忘記了我的ELSEIF。我複製這個並粘貼到我的宏...它不工作。它不會拋出錯誤。它只是通過它。沒有在我的專欄中AN有任何前一個月的價值。 :(@Jarom – SharePoint0508

+0

更新我的代碼片段,使用我的宏反映的內容以及您的更改。我還在lRowB的註釋中包含了值,因爲它是在上一步中設置的,並且不需要重述, – SharePoint0508

+0

你是否想要這個片段填充AN列中的多行?如果是,是循環中的片段?或者你只是想讓它能夠填充AN中的一列? – Jarom

0

我會找到一種方法,有組合框有一個月命名爲「標籤」和1之間的一個數字12作爲「價值」。然後你就可以得到「前一個月」以微不足道的東西:

=If(@[Current Update Month]=1, 12, @[Current Update Month]-1) 

這就給了你1到12之間的數字,雖然;你可以有一點點的UDF暴露VBA.Strings.MonthName

Public Function MonthName(ByVal Index As Long) As String 
    MonthName = VBA.Strings.MonthName(Index) 
End Function 

然後你就可以修改公式爲:

=MonthName(If(@[Current Update Month]=1, 12, @[Current Update Month]-1)) 

或者,你可以使用一個查找表:

Current | Previous 
==========|========== 
January | December 
February | January 
March  | February 
April  | March 
May  | April 
June  | May 
July  | June 
August | July 
September | August 
October | September 
November | October 
December | November 

然後,您可以用簡單的查找來替換嵌套的大型If公式。儘管「月份指數減一」的方法讓我感覺更有效率。

+0

我的實際使用,爲我的用戶選擇他們要更新哪個月。然後它會引用該月份的特定單元格進行更新。除非我先以某種方式先告訴它,如果combobox = 1,那麼這個值是一個數字參考,然後將它構建到一個公式中,然後將12月作爲AN列中的前一個更新月提供,從第2行開始到最後一行排..然後我不知道這將如何工作。 – SharePoint0508

+0

我不知道你剛剛說了什麼,所以我只是要微笑和揮手。如果不是這個答案,那麼你就擁有了在這個頁面上取得成功所需的一切,然後是另一個。如果沒有,您需要編輯您的問題來澄清,也許包括電子表格的屏幕截圖。 –

+0

我在說現在的更新月份總是一個月的名字。它絕不會是mm/dd/yyyy格式的日期。這是combobox1的價值,當用戶從包含所有12個月的下拉列表中選擇月份名稱(不輸入任何日期)時。該值將始終是文本。 – SharePoint0508

1

調用這個函數的使用月份的名稱,它會回報你的前幾個月名

Function GetPreviousMonth(ByVal sMonthName As String) As String 
    GetPreviousMonth = MonthName(Month(DateAdd("m", -1, CDate("01/" & sMonthName & "/2000")))) 
End Function 

我有它設置如下:
enter image description here

+0

當所有信息都直接放在同一個模塊中時,我不想調用其他例程來實現此目的。我已經從一開始就在組合框的用戶輸入中捕獲了日期。然後這個信息被用來確定參考單元以按月放置信息。這是一個複雜的宏觀,這只是一個片段,它將近14頁,並提供多份報告。 – SharePoint0508

+1

使用這種調用另一個例程的方法或者至少使用例程中的代碼會容易得多。或者如果你不想讓程序使用lastmonthupdate = MonthName(Month(DateAdd(「m」)),則可以用'lastmonthupdate = getpreviousmonth(ABCMatrixMonthSelect.ComboBox1.value) ,-1,CDate(「01 /」&ABCMatrixMonthSelect.ComboBox1.value))))' –

+0

As @ DarrenBartrup-Cook提到,如果你不想用它作爲例程,只需將你的'IF..ElseIF '這個聲明。這是一個更好的方法 – Zac

1

=[@[Current Update Month]]
回報當前月份的名稱(或在名爲當前更新月份的列中保存的值)。

=DATEVALUE("1-" & [@[Current Update Month]])
取當前月份的名稱,並將其變成實際日期 - 當前月份的第一個月份。這是一樣的書寫公式=DATEVALUE("1-January")

=EOMONTH(DATEVALUE("1-" & [@[Current Update Month]]),-1)
返回前一個月的最後一天。這與編寫=EOMONTH("1/01/2017",-1)相同。

最終公式:
=TEXT(EOMONTH(DATEVALUE("1-" & [@[Current Update Month]]),-1),"mmmm")
返回前一個月的名稱。這是一樣的寫作=TEXT("31/12/2017","mmmm")

只讀VBA部分,在這種情況下,我會使用@Zacs的答案,並直接在代碼中使用計算,如果你不希望(在我看來)更簡單的方法把它放在一個小功能中。雖然我不會把這一年添加到CDATE(將這一年拖延到今年)。

+0

這是一個月。沒有價值的實際一天進入。該值來自Combobox1。這個組合框是12個日曆月。用戶從下拉菜單中選擇一個。它不是一年或一天的價值,而且價值必須在前一個月。爲AN列。我沒有輸入任何公式到工作表中,他們不保留。 – SharePoint0508

+0

你真的嘗試過配方嗎?一年或一天不需要價值,只需要一個月的文字。如果你想要一個VBA解決方案,那麼Zacs將是我認爲的方式。除此之外,正如@MatsMug所說,我要微笑,揮手,去找另一個問題。 –

0

幾這裏的東西來解決:

1)您使用的表引用[@ [當前更新月],所以列「AN2」有桌子旁邊的參考工作。如果您使用這種類型的參考,它將在任何地方工作 = if(表1 [當前更新月份]。
2)您還在比較文本值,將其放入VBA中需要使用CHR(34)雙引號。這裏是一個代碼短位到式添加到一定範圍的引用表

Let sht.Range("AN2" & lRowB).Formula = "=if([@[Current Update Month]]=" & Chr(34) & "January" & Chr(34) & "," & Chr(34) & "December" & Chr(34) & ", IF([@[Current Update Month]]=" & Chr(34) & "March" & Chr(34) & "," & Chr(34) & "February" & Chr(34) & ",IF([@[Current Update Month]]=" & Chr(34) & "July" & Chr(34) & "," & Chr(34) & "June" & Chr(34) & ")))" 
0

我喜歡它未經宏和容易的工作遵循溶液細胞:
1)添加列與式這幾個月翻譯從文本到數字,例如, 「月」,以1:
=MONTH(DATEVALUE(C4&"1"))

2)加入其減一近一個月內柱:
=IF(D4=1,12,D4-1)

3)添加翻譯月份從數字到文本的最後一列,例如2到「February」: =TEXT(DATE(2010,E4,1);"mmmm")

就這樣。對於20萬行不應該是一個大問題。 One month back example

EDITED
步驟1-3可轉換爲一個的單層線公式:
=TEXT(DATE(2010,IF(MONTH(DATEVALUE(C4&"1"))=1,12,MONTH(DATEVALUE(C4&"1"))-1),1),"mmmm")