• ベストアンサー

VBA 繰り返し処理について

pkh4989の回答

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

'不具合があるかも知れませんが、試してみてください。 ' Sub 繰返し()   Dim mR     As Long   Dim sI     As Long   Dim eI     As Long   Dim wY     As Long   Dim wKey    As String   Dim wStr    As String   Dim wVal    As Variant   Dim wRow    As Long   '   With ActiveSheet     mR = Range("A" & Rows.Count).End(xlUp).Row     wKey = .Cells(1.1)     '     ExitFlg = False     sI = 1     Do While ExitFlg = False       'MAX行を求める       eI = Get_EndRow(wKey, sI, mR)       'KEY単位別にワークへ設定       wVal = .Range("A" & sI & ":D" & eI)       'EXCEL行を設定       For wY = 1 To eI - sI + 1         wVal(wY, 4) = sI + wY - 1       Next       '       '最大数の文字及び行を求める       Call Get_String(wVal, wStr, wRow)       .Cells(wRow, "D") = wStr       If eI >= mR Then         '終了         ExitFlg = True       Else         '次の開始行及びKEYを設定         sI = eI + 1         wKey = .Cells(sI, 1)       End If     Loop   End With End Sub 'MAX行を求める Function Get_EndRow(wStr As String, eI As Long, mR As Long) As Long   Dim wIx     As Long   '   Get_EndRow = mR   With ActiveSheet     For wIx = eI To mR       If CStr(Val(.Cells(wIx, 1))) <> wStr Then         Get_EndRow = wIx - 1         Exit For       End If     Next   End With End Function '最大数の文字及び行を求める Function Get_String(wVal As Variant, wStr As String, wRow As Long) As String   Dim wI     As Integer   Dim wY     As Integer   Dim tBuf()   As String   Dim tCnt()   As Integer   Dim wSeq    As Integer   Dim fFlg    As Boolean   Dim mCnt    As Integer   Dim mStr    As String   '   wSeq = 0   For wI = 1 To UBound(wVal)     wStr = wVal(wI, 3)     If wSeq > 0 Then       fFlg = False       For wY = 1 To wSeq         If tBuf(wY) = wStr Then           tCnt(wY) = tCnt(wY) + 1           fFlg = True           Exit For         End If       Next       If fFlg = False Then         wSeq = wSeq + 1         ReDim Preserve tBuf(wSeq)         ReDim Preserve tCnt(wSeq)         tBuf(wSeq) = wStr         tCnt(wSeq) = 1       End If     Else       wSeq = wSeq + 1       ReDim Preserve tBuf(wSeq)       ReDim Preserve tCnt(wSeq)       tBuf(wSeq) = wStr       tCnt(wSeq) = 1     End If   Next   '   '最大数の文字を設定   mCnt = 0   mStr = ""   For wI = 1 To wSeq     If mCnt < tCnt(wI) Then       mCnt = tCnt(wI)       mStr = tBuf(wI)     End If   Next   '行を求める   For wI = UBound(wVal) To 1 Step -1     If wVal(wI, 3) = mStr Then       wRow = wVal(wI, 4)       Exit For     End If   Next   '   wStr = mStr End Function

Rosicky29
質問者

お礼

ご回答ありがとうございました。 試しに実行してみたのですが、以下のようなエラーが発生しました。 対処方法などございましたら、ご教授ください。 <エラーメッセージ> 実行時エラー”1004”: アプリケーション定義またはオブジェクト定義のエラーです。 <エラー行> 'KEY単位別にワークへ設定 wVal = .Range("A" & sI & ":D" & eI)

関連するQ&A

  • Excel VBAによる検索処理?

    Excelで以下の例のように、A列・B列に入力されているとします。A列を検索して、C列にB列の値を返す式を考えてますが、さっぱりわかりません。VBAとかも正直素人ですが、サンプルもしくは考え方を教えていただければと思います。以下の処理内容です。 ・AXセルが「B」であった場合、次のセル(A(X+1))を検索し、次が空白になるまで検索し、空白になる前の最後の行のB列の値をCXセルに返す。該当しない場合は空白のまま 下記の例ですと3行目、8行目のB列の値を2・3、6-8行目のC列のセルに返すことになります。よろしくお願いいたします。 (処理前) ___A__B__C ------------- 1 2__B__2 3__B__3 4______4 5______5 6__B__6 7__B__7 8__B__8 9______9 (処理後) ___A__B__C ------------- 1 2__B__2__3 3__B__3__3 4______4 5______5 6__B__6__8 7__B__7__8 8__B__8__8 9______9

  • VBAにて最大値と最大値までのデータの数を教えて

    はじめまして。VBA初心者です。 誰か教えてください。 下記のようにA列にデータが並んでおります。 A列はどこまでデータがあるかは、分かりません。 その中で、  何とか独自でC列の1行目に、A列の最大値を記入する事まではできました。 しかし、A列の最大値が数字が入力されているA列の1行目から何番目にその 最大値がくるのかの計算が分かりません。   E列の1行目にその何番目にくるかをしめしたいのですが、 C列の1行目で示すように最大値の値をA列で何番目になるのかの方法を教えてください。 Rangeを使用して、Range("A1:最大値")を選択して、countするとよいのではと思い、 挑戦していましたが、"最大値"の部分をどのように表記していいかわかりません。  どなかた分かる方がいらっしゃいましたらよろしくお願いします。       A列    B列    C列   D列   E列 1行    3    最大値   10   個数    4 2行    5 3行    7 4行   10 5行    9 6行    2 …     … …     …

  • VBAのプログラムに関してです

    VBAに関する質問です。 いま、A列に0~4の数字が順番に繰り返し記入されていて(数字の数はランダム)、B列に適当な値が記入されています。A列の中から1を探しだして(1つ上の行の数字が0)、 その行から1つ戻ったB列の値をC列に記入、A列の次の0~4の繰り返しで同じ条件の1を探してその行から2つ戻ったB列の値をD列に記入する。といったことをA列が空白の行になるまで繰り返し行うというプログラムを教えてほしいです。お願いします。 例) A:00011112233400001123334400011111122233400000- B:12345678912345678912345678912345678912345678- となってるA列のそれぞれの0~4の塊の最初の1をさがしてそれに対応するBをそぜぞれ求めていくというものです。 この場合だと実行結果C・D列には C:379 D:688 となってほしいです。

  • どうVBAを書けばいいのでしょうか

    以下のような表があります。 (sheet1) A列 不規則な数列(←一行目にタイトルが書き込まれています) 13   (←二行目から数字がランダムに書き込まれています)    18 44 36 22 14 27 21 32 35 44 12 (以下続く) Case1[i行の値よりi+1行の値が大きく、i+1行の値よりi+2行目の値が大きい件数] Case2[i行の値よりi+1行の値が大きく、i+1行の値よりi+2行目の値が大きく、i+2行の値よりi+3行目の値が大きい件数] などの件数を、新たなシートに書き出したいのです。 上の例からすると、 (sheet2) A列  B列(←B列に件数を書き込む) Case1  3 Case2  1 のような感じです。 if文で作ってみたのですが、うまく処理してくれません。 どのようなVBAを書けばいいのでしょうか。 分かる方、よろしくお願いします。

  • VBAで

    すいません、エクセルVBAで教えてください A B C D 1 2 3 4 2 3 1 4 3 1 2 4 上記のように、AからD列に数値が入っています。 Cが1のときに、その行を削除(上の場合は、2行目)したいのですが、VBAでプログラムでどう記述すればよろしいでしょうか。 フィルタ機能は使いたくないので、IF文がいいのでしょうか。 申し訳ないですがよろしくお願いします

  • エクセルVBAでのまとめ計算

     初めまして、よろしくお願いします。 データーで    A      B     C     D      E ・・・ 1              5     7      2 2              3     7      0 3 4              6     3      6 5              2     8      3 6              0     3      4 ・     ・      ・      ・      ・ ・     ・      ・      ・      ・ 100             3     4      5 という表がありますA列には(C列の値/(D列以降の平均値))をB列には(C列の値-(D列以降の平均値))を表示させたいと思います。たまに3行のような空白の行があります。関数式ではなく、VBAで解る方、よろしくお願いします。

  • EXCEL VBA

    はじめまして。ExcelのVBAについて質問させて頂きます。 - A-B-C            1 0 あ        2 0 い        3 1 う           4 1 え           5 1 お   上記のようなデータに対して、A列の値が1の場合、B列の値をC列へコピー して、B列をゼロにする。A列の値が0の場合は、そのまま。 (結果) - A-B-C            1 0 あ        2 0 い        3 1 0  う           4 1 0 え           5 1 0 お   といったようにVBAを作成したいのですが、なにぶん初心者なもので、 どのように記述すればよいのかわかりません。 よろしくお願いいたします。

  • Excel VBA B列を検索して1行下をコピぺ

    はじめまして。 VBAを始めたばかりですが、自分ではどうにもならないので、教えていただければと思い、初めて質問致します。 A1~G1、1行目から1000行目まで各セルに数字がランダムに1つずつ入っているデーターSheet1があり、コマンドボタンを押すことによってMsgBoxに入力した数字をB列を下に検索していき、例えば、数字の8が入力されたら、B1から下にB列に8が出現したらそのセルの1つ下の行(A列~G列まで)をコピーしてSheet2に抽出したいと考えているのですが、なかなか出来ず、困っています。 イメージとして A B C D E F G H I 1 5 14 30 25 30 3 9 2 22 34 6 7 29 49 3 3 1 8 20 4 10 6 45 4 30 15 34 50 2 5 9 5 11 8 45 7 6 20 1 6 40 8 48 25 36 4 10 7 21 22 30 28 6 7 36 8 2 3 50 2 1 43 6 と、データがSheet1に仮にあって、8が入力されたなら4行目の 30 15 34 50 2 5 9 と 6行目 40 8 48 25 36 4 10、7行目 21 22 30 28 6 7 36という様に抽出されてSheet2に 上から順に貼り付けられる様にしたいので、皆様の御知恵をお貸しいただければと 思っております。かなり複雑かとは思いますが、どうか宜しくお願いいたします。 FINDやOFFSET、IF文、ループ等を使ってみましたが私のレベルでは全く話になりませんでした。 まだVBAかけだしなもので、なるべ簡単なくプログラムでお願いいたします。

  • Excel VBAでの値の比較

    お世話になります。 Excel VBAでの値の比較方法についてご教授頂きたく存じます。 下記のような値がセルに入っていると仮定しまして、 セルA1とセルG1を比較する セルA2とセルG2を比較する セルB1とセルH1を比較する セルB2とセルH2を比較する 値が違う場合のみ、A列、又は、B列のセルの色を変更したいのですが・・・。 下記例の場合であれば、B1とA2がセルの色が変われば良いです。    A列 B列    G列 H列 1行  1  1     1   2 2行  2  2     3   2 VBAで実現したいと思います。 何卒、宜しくお願い申し上げます。

  • ☆Excel VBAでAVERAGE関数を使うとき・・・

    こんにちは。VBA初心者です。 VBAでAVERAGE関数を使いたいのですが、参照範囲を最終行まで指定したい場合、 どのようプログラムすれば良いのでしょうか?     A   B   C    1 5000  2 2000  3 3000  4 1000  5 6000  6  :  7  :    ← A列の値を平均する。           A列には膨大な行が存在すると仮定します。 VBAに詳しい方、教えてください。 どうか、よろしくお願いしますm(_ _)m