2011-12-19 16 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

エラーは、アクセスしようとしている配列が、あなたが探している序数を含むように定義されていないことを意味します。たとえば、配列10の位置は0〜9です。したがって、array(10)エラーまたは配列(-1)は、そのエラーをスローします。

excelが0または1ベースの配列であるかどうかはわかりません。

おそらくあなたはこれを行うには、VBA(マクロ)を必要としない

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

おかげのような何かを販売している、エラーがこの行に関して行っ:)そして、何される: 'シート(「シート2」)範囲(「A2」)(サイズを変更します。 Rng.Count)= Application.Transpose(ray) '?結果が私のExcelファイルのSheet2の行に書き込まれることを意味しますか? – ArVan

+0

これは、(レイ)で行われた転置が、Sheet2.A2から開始されることを意味します。レンダリングにはそれ以上の時間がかかります。しかし、それはA2で始まり、転位に基づいてそこから(光線) – xQbert

+0

私はそう思ったが、私は結果を見ることができません:( – ArVan

0

ray(Dn.Row - 1) = Col 

を変更。これは、ワークシート式を使用して行うことができます。

など。

あなたの生産者が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()関数を使用してワークシート式を使用することもできます。

私は、2つのプロデューサの出力値が同じ場合、何をしたいか分かりません。あなたの質問のVBAの例では、ロジックは次のように見えます: - 2人のプロデューサーが1ヶ月でトップに立っている場合は、最初に遭遇したものを選びます。上記の式はこの論理を再現するはずです。

+0

私はこれについて知っているが、私が探しているものではありません。 – ArVan

+1

その場合 - a)あなたの友人が運動を試みることをお勧めします。あなたが彼らの宿題をしていれば多くを学ぶつもりはないと思います。そして、あなたは宿題をしましょう。 )とVBAソリューションでは、よりクリーンで効率的な数式ベースのソリューションを追加マークとして提出するのはどうでしょうか? ;-) –

+0

a)私の友人は私が推測するこれを学ぶ必要はありません:) b)いいえ、余分なマークとしてカウントされません。それは彼らの主題であるので、VBAで終わらなければならない。 – ArVan

0
私はかなり広範囲にこれらの機能を使用していると、彼らは非常に信頼性が高く、高速です

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 

はそれを参照を与える(。元"A2")、それが充填されたセルを下に戻ります、または右までと空のセルが見つかりました。複数選択するには

が、私は通常

Set r = Range("A2") 
N = CountRows(r) 
Set r = r.Resize(N,1) 
関連する問題