2011-12-19 309 views
1

首先,我不知道如何在Excel中編寫宏,但現在我必須爲朋友編寫代碼。所以,我們走了。 在我的Excel表格中,我有一張表,其中包含一些生產者作爲列和一年中的12個月行。在它們相交的單元格中,寫入了製造商在該月份生產的產品數量。現在我需要在每個月內查找生產商品的最大值和最小值,並輸出該商品的生產者。 我找到了一個類似問題的代碼,但我不明白,它有錯誤。 下面是代碼:使用宏獲取Excel中列的最大值

Sub my() 
Dim Rng As Range, Dn As Range, Mx As Double, Col As String 
Set Rng = Range(Range("A1"), Range("A6").End(xlUp)) 
ReDim ray(1 To Rng.Count) 

For Each Dn In Rng 
Mx = Application.Max(Dn) 
    Select Case Mx 
     Case Is = Dn.Offset(, 0): Col = "A" 
     Case Is = Dn.Offset(, 1): Col = "B" 
     Case Is = Dn.Offset(, 2): Col = "C" 
     Case Is = Dn.Offset(, 3): Col = "D" 
    End Select 
     ray(Dn.Row - 1) = Col 
Next Dn 

Sheets("Sheet2").Range("A2").Resize(Rng.Count) = Application.Transpose(ray) 
End Sub 

我得到以下錯誤: 所以我的問題是,這是什麼意思的錯誤,什麼我需要在此代碼更改爲工作?

EDIT1: 好的,現在錯誤消失了。但我在哪裏得到結果?

EDIT2 我知道這條線是負責將在指定位置的結果,但執行後,我不能看到他們。那有什麼問題?

回答

1

錯誤表示您嘗試訪問的數組尚未定義爲包含您要查找的序號:例如Array 10的位置爲0-9,所以如果我嘗試訪問數組(10),它會拋出錯誤或數組(-1)它會拋出該錯誤。我不記得excel是基於0或1的數組。

可能改變

ray(Dn.Row - 1) = Col 

if dn.row-1<> 0 then ' or set it to <0 if zero based. 
ray(Dn.Row - 1) = Col 
end if 
+0

感謝,錯誤消失了:)又是怎麼回事該行:'表( 「Sheet2的」)範圍( 「A2」)調整(。 Rng.Count)= Application.Transpose(ray)'?這是否意味着結果將被寫入我的Excel文件的Sheet2中? – ArVan 2011-12-19 17:51:35

+0

這意味着在(ray)上完成的轉置將從Sheet2.A2開始。這可能需要更多的渲染;但它會從A2開始,並根據轉置完成到(ray) – xQbert 2011-12-19 18:11:54

+0

我認爲是這樣,但我看不到任何結果:( – ArVan 2011-12-19 18:32:20

0

你不需要VBA(宏)來做到這一點。它可以使用工作表公式完成。

例如

如果生產者P1,P2,P3,P4和你的表如下: -

 A  B C D E F 
    +------------------------------------------- 
1 | Month P1 P2 P3 P4 Top Producer 
2 | Jan  5 4 3 2  
3 | Feb  2 3 5 1 
4 | Mar  6 4 4 3 
... 
... 

下面的公式放置在細胞F2,F3,F4,...將挑選出前生產者在每個月。

=INDEX($B$1:$E$1,MATCH(MAX(B2:E2),B2:E2,0)) 

通常最好嘗試在可能的情況下使用內置的Excel功能。只有在真正需要的情況下才能使用VBA。即使您將頂級生產者/月份數據用於某些僅在VBA中可用的其他操作,至少頂級生產者/月份數據派生由工作表完成,這將簡化整個流程所需的VBA 。

通過使用TRANSPOSE()函數,也可以使用工作表公式來移位範圍。

順便說一句 - 我不確定你想要做什麼,如果兩個生產者有相同的產出價值。在你的問題的VBA示例中,邏輯似乎是: - 如果兩個生產者在一個月內聯合最高,請選擇遇到的第一個。我上面給出的公式應該複製這個邏輯。

+0

我知道這件事,但這不是我要找的。這是一項任務,或者讓我們說一個家庭作業,需要用VBA完成 – ArVan 2011-12-19 18:02:49

+1

在這種情況下 - a)我建議你的朋友嘗試練習,如果你爲他們做作業,他們不會學到太多東西,而b )以及VBA解決方案,如何提交更清潔,更高效,基於配方的解決方案以獲得額外的商標? ;-) – 2011-12-19 18:15:51

+0

a)我的朋友不需要學習這個我猜:) b)不,它不會算作額外的分數。這需要用VBA來完成,因爲這是他們的主題。 – ArVan 2011-12-19 18:36:43

0

我已經使用這些功能相當廣泛,他們都非常可靠和快速的:(前"A2"

Public Function CountRows(ByRef r As Range) As Integer 
    CountRows = r.Worksheet.Range(r, r.End(xlDown)).Rows.Count 
End Function 

Public Function CountColumns(ByRef r As Range) As Integer 
    CountColumns = r.Worksheet.Range(r.End(xlToRight), r).Columns.Count 
End Function 

給它一個參考,它會返回填充細胞下來,或右側,直到和找到空單元格。

要選擇多個銷售我平時做這樣的事情

Set r = Range("A2") 
N = CountRows(r) 
Set r = r.Resize(N,1)