• 締切済み

VBAの簡略化について

VBAで数値をカウントするマクロを作りました。  Dim Co1 As Integer Co1 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<1") Dim Co2 As Integer Co2 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<2") Dim Co3 As Integer Co3 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<3") Dim Co4 As Integer Co4 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<4") Dim Co5 As Integer Co5 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<5") Dim Co6 As Integer Co6 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<6") Dim Co7 As Integer Co7 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<7") Dim Co8 As Integer Co8 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<8") Dim Co9 As Integer Co9 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<9") Dim Co10 As Integer Co10 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), "<10") Dim Co11 As Integer Co11 = WorksheetFunction.CountIf(Range(Cells(○, ○), Cells(○, ○)), ">=10") Cells(2, 1) = Co1 Cells(3, 1) = Co2 - Co1 Cells(4, 1) = Co3 - Co2 Cells(5, 1) = Co4 - Co3 Cells(6, 1) = Co5 - Co4 Cells(7, 1) = Co6 - Co5 Cells(8, 1) = Co7 - Co6 Cells(9, 1) = Co8 - Co7 Cells(10, 1) = Co9 - Co8 Cells(11, 1) = Co10 - Co9 Cells(12, 1) = Co11 Cells(2, 1) = "0~0.999" Cells(3, 1) = "1~1.999" Cells(4, 1) = "2~2.999" Cells(5, 1) = "3~3.999" Cells(6, 1) = "4~4.999" Cells(7, 1) = "5~5.999" Cells(8, 1) = "6~6.999" Cells(9, 1) = "7~7.999" Cells(10, 1) = "8~8.999" Cells(11, 1) = "9~9.999" Cells(12, 1) = "10~" これを短くする方法を教えてください。

  • enia
  • お礼率34% (9/26)

みんなの回答

  • Gattyonn
  • ベストアンサー率0% (0/0)
回答No.5

Option Explicit Sub Goose() Dim Co(0 To 10) Dim Poo As Integer Dim Boo As Integer 'データ範囲(例えばE列) Poo = 5 Co(0) = 0 For Boo = 0 To 9 Co(Boo + 1) = WorksheetFunction.CountIf(Columns(Poo), "<" & (Boo + 1)) Cells(Boo + 2, "B").Value = Co(Boo + 1) - Co(Boo) Cells(Boo + 2, "A").Value = Boo & "~" & Boo & ".999" Next Cells(12, "B").Value = WorksheetFunction.CountIf(Columns(Poo), ">=10") Cells(12, "A").Value = "10~" MsgBox ("Gattyonn!!") End Sub

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

一案ですが ご希望の集計ができる基本シートを準備して 関数を配置しておく。 VBAのボタンをおすと 別のシート(或いは 新規のシート)へ 値の貼り付けで固定してしまう。 VBAのコードはわずかになりますし 将来、シートの変更が発生した場合も コードを修正することなく、基本シートを変更すれば いくらでも見栄えの良いシートになり便利かと思います。

  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

次のようなことをやりたいのかな。 Sub test() Dim cnt(11) As Integer, i As Integer, rng As Range Set rng = Range(Cells(〇, 〇), Cells(〇, 〇)) For i = 1 To 10 cnt(i) = WorksheetFunction.CountIf(rng, "<" & i) Next cnt(i) = WorksheetFunction.CountIf(rng, ">=10") For i = 1 To 10 Cells(i + 1, 1) = i - 1 & "~" & i - 0.001 Cells(i + 1, 2) = cnt(i) - cnt(i - 1) Next Cells(i, 1) = i - 1 & "~" Cells(i, 2) = cnt(i) End Sub なお、同じ結果を得るなら、「分析ツール」―「ヒストグラム」でもできるし、これをVBAで使えば短くなる。 Sub test2 Application.Run "ATPVBAEN.XLA!Histogram", ActiveSheet.Range("〇:〇"), _ ActiveSheet.Range("□"), ActiveSheet.Range("△:△"), False, False _ , False, False End Sub これだけ。 "〇:〇" データ範囲 "□"   出力先 "△:△" データ区間のセル範囲

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

> Cells(2, 1) = "0~0.999" ここから始まる部分だけで良いかも ※せっかく求めた列に上書きしているようなので という事は置いといて 求めたのがA列、上記がB列として CountIf を使わないで、ベタに処理する例になれたら・・・ ※ 範囲指定したセル全部判別するので、   範囲が大きければそれなりに遅くなると思います。 ※ セル結合がないもので動くとは思います Public Sub Samp1()   Dim i As Long, j As Long   With Range("A2:B12")     .ClearContents     With .Columns(2)       .Formula = "=ROW()-2&""~""&ROW()-2&"".999"""       .Value = .Value     End With     .Cells(.Count).Value = "10~"   End With   With Range(Cells(○, ○), Cells(○, ○))     For i = 1 To .Count       If (Not IsEmpty(.Cells(i).Value)) Then         On Error Resume Next         j = Int(.Cells(i).Value)         If (Err = 0) Then           If (j < 0) Then             j = 0           ElseIf (j > 10) Then             j = 10           End If           Cells(j + 2, "A").Value = Cells(j + 2, "A").Value + 1         End If       End If     Next   End With End Sub とか Public Sub Samp2()   Dim rng As Range   Dim iSum As Long, i As Long   Set rng = Range(Cells(○, ○), Cells(○, ○))   With Range("A2:B12")     .ClearContents     With .Columns(2)       .Formula = "=ROW()-2&""~""&ROW()-2&"".999"""       .Value = .Value     End With     .Cells(.Count).Value = "10~"     iSum = 0     For i = 1 To 10       With .Cells(i, 1)         .Value = WorksheetFunction.CountIf(rng, "<" & i) - iSum         iSum = iSum + .Value       End With     Next     .Cells(i, 1).Value = WorksheetFunction.CountIf(rng, ">=10")   End With   Set rng = Nothing End Sub

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 一例です。 仮にCOUNTする範囲を G1~G30 とした場合のコードです。 Sub Sample1() Dim k As Long, myRng As Range, myArry myArry = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) Set myRng = Range(Cells(1, "G"), Cells(30, "G")) '←★ここで範囲指定 For k = 0 To UBound(myArry) With Cells(k + 2, "A") .Value = k & "~" & k + 0.999 .Offset(, 1) = WorksheetFunction.CountIf(myRng, "<" & myArry(k)) _ - WorksheetFunction.Sum(Range(Cells(1, "B"), Cells(k + 1, "B"))) End With Next k With Cells(12, "A") .Value = "10~" .Offset(, 1) = WorksheetFunction.CountIf(myRng, ">=" & 10) End With End Sub こんな感じでは同でしょうか?m(_ _)m

関連するQ&A

  • エクセル VBA もっときれいな書き方?

    Sub test() Dim i As Integer, n As Integer n = 1 For i = 2 To 150 If Cells(i, 1) <> Cells(i - 1, 1) Then Cells(i - 1, 5) = i - n Cells(i - 1, 6) = Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) n = i End If Next i End Sub 上記のマクロですが Application.WorksheetFunction.Sum(Range("B" & n & ":" & "B" & i - 1)) この部分、もっとスマートに書く方法を教えてください。 Range("B" & n & ":" & "B" & i - 1)って、ちゃんと動きますが、書き方が何か変なような気がするんです。 よくわかってもいないのにすみません。

  • VBAで文字列のカウントがうまくいかない・・・です

    Dim cnt As Long Dim i As Long Dim lastRow As Long For i = 1 to 20 step 2 lastRow = Cells(65536, i).End(xlUP).Row cnt = WorksheetFunction.CountIf(ActiveSheet.Range(Cells(10, i),Cells(lastRow, i), "お世話になっております")cnt = cnt + cnt Next Excelのセルを1列ずつ飛ばして列に「お世話になっております」が含まれたら件数をカウントしています。 そのカウント数が何故かリセットされてしまいます。 カウント数を足していきたいのですが・・・考え方自体が違うのでしょうか?

  • VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。

    VBAのデータ型に関する質問です。 以下のような宣言と処理をしました。 Dim 数値1 As Integer Dim 数値2 As Integer Dim 数値3 As Long 数値1=Range("b5").Value 数値2=Range("c5").Value 数値3=数値1*数値2 この式では、数値3がLongの型ではなくIntegerになってしまいオーバーフローのエラーになってしまいます。(10000×5の場合等)Long型のまま代入する方法がありましたら教えてください。よろしくお願いいたします。

  • Excel VBA TREND関数について

    VBAにて6次近似の計算をするためのプログラムを組んでいるのですが【コンパイルエラー:不正な文字です】 と言われてしまいます。 6次近似の計算式の記載方法を教えて下さい。 よろしくお願い致します。 尚、現状は以下の通りです。 ============================== Dim i As Long Dim deg As Double Cells(i, 10).Value =Application.WorksheetFunction.Trend(Range(Cells(i, 1),Cells(i + 5, 1)), Range(Cells(i, 8), Cells(i + 5, 8)))^{1,2,3,4,5,6}, deg^{1,2,3,4,5,6}, 1) ===============================

  • 条件にあてはまるデータの数をカウントするエクセルVBA

    下記のようにA列に1~3のコードがありB~E列には測定値があります。 B列以降の測定値のカウント(+3の個数、+2の個数…)を列ごとにVBAでカウントしてます。 A列に関係なくカウントするコードは記述して実行できましたが A列の条件が1の時だけカウントするVBAが良くわかりません。 シート A    B    C  ・・・E 1    -1   +1  ・・・ 1    +2   0 2     0   0 3    -3   0 1    -1   +3 101行目以降 +3    カウント数 … +2      〃 +1      〃 0       〃 -1      〃 -2      〃 -3      〃   A列に関係なくカウントするコード sub カウント() Dim 行 As Long Dim 列 As Long For 列 = 2 To 5 For 行 = 101 To 107 Cells(行, 列).Value = Application.WorksheetFunction.CountIf(Range(Cells(2, 列), Cells(100, 列)), Cells(行, 1)) Next 行 Next 列 End Sub

  • VBA ワークシート関数のエラー

    シートに数式を入れていたものを、VBAで値のみ入力しようと考えています。 そこで、.Cells(1,1) = WorksheetFunction.数式といった形のメソッドを試しています。 しかし、複雑な数式を記述するとエラーが出てしまいます。 成功 (iferrorというワークシート関数が1つ) Debug.Print WorksheetFunction.IfError(1 / .Cells(1, 5) + 1 / .Cells(1, 6) + 1 / .Cells(1, 7) - 1, "P") 失敗(ワークシート関数のifとcountifなど複数のものが数式に混入) Debug.Print WorksheetFunction.If(CountIf(Range("C17:D49"), Range("C29")) > 5, Range("C29"), Range("D29")) Countifの場所でエラーになります。このcountifを使えるようにするためには、どうすればよいのでしょうか? WorksheetFunction.if(WorksheetFunction.Countif(、、、、という書き方はダメでした。 数式が汚くてすみません。 宜しくお願いいたします。

  • EXCEL VBA VLOOKUP 範囲を変数で

    Excel VBA で VLookup()の第2引数の範囲を行と列の数値の変数で指定したいのすが どのように記述すればよいでしょうか。 以下の式がエラーにならないように具体的に直していただけないでしょうか。 よろしくお願いします。 ----------------------------------- Dim d1 As String Dim d2 As String Dim r1 As Integer Dim r2 As Integer Dim c1 As Integer Dim c2 As Integer Dim c3 As Integer d1 = "愛知" r1 = 2 r2 = 782 c1 = 3 c2 = 5 c3 = 4 d2 = VLookup(d1, Worksheets("Sheet1").Range(Cells(r1, c1), Cells(r2, c2)), c3, False)

  • VBA 選択された離れたセルの値の取得について

    EXCELのVBAでどうしても前に進めず困っております。 目的としているコードは、離れたセル(複数)をあらかじめCtrlキーで選択状態にしておき、選択されたセルの値のみをVBAが別のセルに並べていくというものです。 以下が私の作ったコードなのですが、思ったとおりの動作をしてくれません。 VBA初心者なもので、おかしな記述がたくさんあると思うのですが、どなたかアドバイスお願いします。 Public Sub xx() Dim SelectArea As String Dim TargetCell As Range Dim a As Integer Dim Row As Integer Dim Column As Integer Dim CNT1 As Integer a = 0 Row = 0 Column = 0 For CNT1 = 1 To 10 Row = Row + 1 SelectArea = Selection.Address Set TargetCell = Range("B3").Cells(Row - 1, Column) If Intersect(Range(SelectArea), TargetCell) Is Nothing Then Else Range("A30").Cells(a, 0) = Range("B3").Cells(Row - 1, Column).Value a = a + 1 End If Next End Sub

  • VBA VLOOKUP 別のファイルを参照

    VBA VLOOKUP 別のファイルを参照 いつもこちらでお世話になっている者です。 VBAの勉強をしております。 別のファイルからVLOOKUPで値を参照したいのですが、 範囲を指定してみましたが、 「worksheetFunctionクラスのVlookupプロパティを参照できません」 とのメッセージが出てしまいます。 なお、値は空白になる行もありますので、 if関数で回避してみましたがうまくいきません。 いろいろ試しましたが、何度やってもうまくいかないので こちらに質問させていただきました。 お詳しい方、ご伝授いただければ助かります。 よろしくお願い致します。 環境はExcel2007です。 Sub sample() Dim 範囲 As Range Dim wb As Workbook, wb2 As Workbook Dim r As Integer,intRow As Integer Workbooks.Open Filename:="***.xlsm" Set wb = ThisWorkbook Set wb2 = ActiveWorkbook Set 範囲 = wb2.Sheets("PvtSht2").Range("Database3") r = wb.Sheets("sheet1").Range("A28:N28").End(xlToRight).ColumnintRow = 3 With wb.Sheets("sheet1") Do Until .Cells(intRow, 1).Value = "" .Cells(intRow, (r + 1)) = Application.WorksheetFunction.If((Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False)) = 0, "", Application.WorksheetFunction.VLookup(Cells(intRow, 1), 範囲, 2, False)) intRow = intRow + 1 Loop End With End sub

  • マクロでCOUNTIFを使いたい

    マクロでCOUNTIFを使いたい COUNTIFを使いたく、下記のマクロを作成しました。 【転記元】A列の値が【転記先】A列には何回出てくるのか?を転記先C列に書き出す作業を したいのですが、提示したコードだと、★のC列全てに「1」が入ってしまいます。 ところが、★★の部分を下記のように書き替えると、正常にカウントされた値が入ります。 ent.Cells(i + 1, "C").Formula = Application.WorksheetFunction.CountIf(mst.Range("A2:A100"), ent.Cells(i + 1, "A")) なぜこうなるのか?原因が知りたくて頭を悩ませております。 お解りの方がいらっしゃればどうぞご指摘ください。 宜しくお願い致します。 ------------------------------------------------------------ 【転記元のシート】  A列  10    10  20  20  50 【転記先のシート】  A列  B列  C列 ←★このC列に結果を表示させたい  10      2  20      2  50      1 ------------------------------------------------------------ Sub カウントテスト() Dim ent As Worksheet, mst As Worksheet Dim i As Integer Dim lstcel As String Dim mstrange As Range Dim sach As Variant Set ent = Workbooks("転記先").ActiveSheet Set mst = Workbooks("転記元").ActiveSheet Set mstrange = mst.Range("A2:A100") i = 1 lstcel = mst.Cells(Rows.Count, "A").End(xlUp).Row sach = ent.Cells(i + 1, "A") For i = 1 To lstcel If mst.Cells(i + 1, "A") <> "" Then '↓★★ここの部分を書き替えるときちんとカウントされる ent.Cells(i + 1, "C").Formula = Application.WorksheetFunction.CountIf(mstrange, sach) End If Next i End Sub

専門家に質問してみよう