excel2007 VBA countif関数

このQ&Aのポイント
  • CountIf関数が使えなくて(構文エラーになる)困っています。
  • ワークシートで試した時には、普通に動いていたのですが、、、、A列のデータに重複がないか調べるプログラムで、flag列というのがあってここに0が入っている行のデータのみ重複をチェックするようにする(途中)です。
  • 矢印で書いた部分がおかしくて、なぜか構文エラーとなります。COUNTIF(A:A,A&i) という風に本当は使いたいのですが ":"で構文エラーになってしまいます。さんざん調べたのですが、私の力では解決できません。将来的にCOUNTIFのカウント数が1>でNGと表示させるつもりです。
回答を見る
  • ベストアンサー

excel2007 VBA countif関数

CountIf関数が使えなくて(構文エラーになる)困っています。ワークシートで試した時には、普通に動いていたのですが、、、、A列のデータに重複がないか調べるプログラムで、flag列というのがあって ここに0が入っている行のデータのみ重複をチェックするようにする(途中)です。 矢印で書いた部分がおかしくて、なぜか構文エラーとなります。COUNTIF(A:A,A&i) という風に本当は使いたいのですが ":"で構文エラーになってしまいます。さんざん調べたのですが、私の力では解決できません。将来的にCOUNTIFのカウント数が1>でNGと表示させるつもりです。 よろしくお願いします。 'flagデータ数を配列に代入 For i = 1 To lRow flag_column(i) = Cells(i + 1, flag_column_number).Value '各行の情報を配列に代入 Next i '配列が0の行についてCOUNTIF関数を実行 For i = 1 To lRow If flag_column(i) = 0 Then j = COUNTIF(A1:A10, A & i)  <- ここ Cells(i + 1, 6).Value = j End If Next i

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんばんわ とりあえず、速報的な回答として、ワークシート関数をVBA上で使用する使い方が間違っている。 サンプルとしてこんな感じとか。 Sub ASD() Dim rRange As Range Dim j As Long Set rRange = Worksheets("Sheet1").Range("A1:A10") A = 1 j = Application.WorksheetFunction.CountIf(rRange, A & i) MsgBox (j) End Sub ココとか http://officetanaka.net/excel/vba/db/db02.htm ココを参考にしてみて。 http://hinekure.vba-soft.com/?eid=484729

参考URL:
http://hinekure.vba-soft.com/?eid=484729
youkan_ni_ocha
質問者

お礼

回答ありがとうございます。勉強不足でした。ありがとうございます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

標準モジュールに Sub test01() j = WorksheetFunction.CountIf(Range("a1:A10"), 1) MsgBox j End Sub で正しく件数をカウントしましたよ。2007、2010でも変わりない。 (1)ワークシート関数をVBAで使う場合、前にWorksheetFunction.またはApplication.WorksheetFunction.をつける必要があること。 (2)VBAでは、セル範囲を示す引数は、シートの場合のA1:A10などはRange("A1:A10")としなければならない。 あるいはRange(Cells(・・),Cells(・・)) (3)VBAではそのままは使えない関数がある。(本質問の件の関数のことではないが) これらはVBAでワークシートの関数を使うときの常識。 データ最下行が固定で無い場合は Sub test02() d = Range("a65536").End(xlUp).Row 'MsgBox d j = WorksheetFunction.CountIf(Range("a1:A" & d), 1) MsgBox j End Sub -- 一般にエクセルのシートがメモリ的には配列的に考えられるので、データをさらに配列に入れることは必要が無いのでは?と 振り返ることが必要。 全般に少時間の勉強・経験で、ことをやろうとしている感じ。 まだまだ使うよりVBAやエクセルの智識輸入の時期だろう。

youkan_ni_ocha
質問者

お礼

ありがとうございます。

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.2

そこにあるデータをなぜわざわざ配列に格納したいのか不明という回答: sub macro1()  dim c as long  dim r as long  dim i as long  c = あなたのflag_column_number  r = あなたのlRow  for i = 1 to r   if cells(i + 1, c) = 0 then    cells(i + 1, 6) = application.countif(range("A1:A10"), cells(i, "A"))   end if  next i end sub アナタのヤリタイ流儀を最大限尊重した回答: 間違い: j = COUNTIF(A1:A10, A & i)  <- ここ 正解: j = application.worksheetfunction.countif(range("A1:A10"), range("A" & i).value)

youkan_ni_ocha
質問者

お礼

ありがとうございます。

関連するQ&A

  • [VBA] CountIfに変数を使いたい

    ある数値データがA1:A100まであるとします。これをいくつかの変数に基づいて数えたい場合、どうしたらいいのでしょうか? x=1 For i = 1 To 10 Cells(i, 5) = WorksheetFunction.CountIf(Range("A1","A100),">-(x)") x=x+10 Next i のような式を作ったんですが、うまく働いてくれません。たぶん変数xが使えないからだと思いますが、他にいい方法が浮かびません。いい方法がありましたら教えてください。よろしくお願いします。

  • 【Excel VBA】日付の代入

    現在以下の操作を行いたく、コードを作成しています。 ・20~23行で各最大値を抽出し、C列に代入する ・最大値に紐づく日付をD列に代入する ・D列の日付が入ったセルを改行し、 2行目に"(曜日)"を入力する <現在のExcelデータ詳細> A20:"処理1" A21:"処理2" A22:"処理3" A23:"処理4" B19~AF19:日付 B20~AF23:任意の数字 C31:処理1の最大値 C33:処理2の最大値 C35:処理3の最大値 C37:処理4の最大値 D31、D33、D35、D37:日付 L(曜日)を入力予定 最大値に紐づく日付をD列に代入するところで 躓いています。 ご教示いただけないでしょうか。 現在のコードは下記の通りです。 Sub 最大値の取得() Dim max As Long Dim row As Integer Dim column As Integer For row = 20 To 23 max = 0 For column = 2 To 32 If Cells(row, column).Value > max Then max = Cells(row, column).Value End If Next Cells((row - 20) * 2 + 31, 3).Value = max For i = 4 To 1 Step -4 '編集中 Cells((row - 20) * 2 + 31, 4).Value = Cells(row - i, column - 1) '編集中 Next End Sub

  • 配列のフリーズを解消してください。

    Sub データ原本() Dim wsAll As Worksheet Set wsAll = Worksheets("All(5)") Dim lRow As Long, lCol As Long Dim i As Long, j As Long, cnt As Long With Worksheets("データ原本") '日付S行を日付に変更(「.」を「/」に置換) lRow = .Cells(Rows.Count, 1).End(xlUp).Row Dim MyArray As Variant MyArray = Range(.Cells(10, 1), .Cells(lRow, 1)) For i = 1 To lRow - 9 MyArray(i, 1) = Replace(MyArray(i, 1), ".", "/") Next Range(.Cells(10, 1), .Cells(lRow, 1)) = MyArray Erase MyArray '配列の初期化 '「天気」両サイドの &「内・外」両サイドの空白スペースを削除 lRow = .Cells(Rows.Count, 1).End(xlUp).Row MyArray = Range(.Cells(10, TNK), .Cells(lRow, TNK)) For i = 1 To lRow - 9 MyArray(i, 1) = Trim(MyArray(i, 1)) Next Range(.Cells(10, TNK), .Cells(lRow, TNK)) = MyArray Erase MyArray '配列の初期化 '数値0のデータ行の行削除 lRow = .Cells(Rows.Count, 1).End(xlUp).Row lCol = .Cells(9, Columns.Count).End(xlToLeft).Column Dim arr_A As Variant, arr_B As Variant arr_A = Range(.Cells(9, 1), .Cells(lRow, lCol)).Value ReDim arr_B(1 To lRow - 8, 1 To lCol) cnt = 0 For i = 1 To lRow - 8 If arr_A(i, 18) <> 0 Then cnt = cnt + 1 For j = 1 To lCol arr_B(cnt, j) = arr_A(i, j) Next j End If Next i .Range("A9").Resize(lRow, lCol).Value = arr_B End With End Sub  上記のコードを2回実行すると2回目には、 MyArray(i, 1) = Replace(MyArray(i, 1), ".", "/")のところで「型が一致しません。」とフリーズします。かと言って 「 '数値0のデータ行の行削除」コードを一括削除して、実行ボタンを何度押してもフリーズすることはありません。どこに不具合が生じているのかわからないのですが、どなたか名回答を宜しくお願いします。

  • Excel VBA 列の最後の値を代入

    たびたびすみません。 指定したセルの、最終列の値を、任意のセルに入れたいのですが、 オブジェクトが必要です、というエラーがでます。 Sub 単価代入() Dim i As Integer Application.ScreenUpdating = False For i = Range("IV2").End(xlToLeft).Column To 1 Step -1 If InStr(Cells(2, i).Value, "単価") > 0 Then Cells(3, i).Value = Cells(3, i).End(xlToRight).Column.Value End If Next i Application.ScreenUpdating = True End Sub Cells(3, i).Value = のあとの指定方法がまずいのかと思いますが。。 どうぞ宜しくお願い致します。

  • countif/sumifのようなVBA関数

    こんにちは エクセルVBAで配列aをワークシート関数countifで計算したいのですが、できないようです。代わりになるVBA関数はないでしょうか?もしくは、代替可能な方法はないでしょうか?sumifの代わりもご教示ください! よろしくお願いします。 --------------- a(0)=1 a(1)=10 a(2)=100 msgbox worksheetfunction.countif(a,">50") 'ここでエラーとなる。 -- エクセル2003

  • VBAのcountif

    ここで質問させていただき、配列に必要なデータを入力する所までは出来ました。 次に各行ごとの"OK"の数をカウントしたいのですが、どのように記述すればよいのでしょうか? Sub count0(a, b, c, d, e)  Dim i1 As Long  Dim i2 As Long  Dim A1 As String  Dim bb As Variant  Dim cc As Variant  Dim dd As Variant  Dim ee As Variant  Dim myLastRow As Long  Sheets(a).Select  myLastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1  bb = Range(b).Resize(myLastRow, 6)  cc = Range(c).Resize(myLastRow, 6)  dd = Range(d).Resize(myLastRow, 6)  ee = Range(e).Resize(myLastRow)  For i1 = 1 To myLastRow   For i2 = 1 To 6    If bb(i1, i2) = "" Then      A1 = "NG"     ElseIf bb(i1, i2) = "A1" Or cc(i1, i2) = "A1" Then      A1 = "-"     ElseIf bb(i1, i2) = cc(i1, i2) Then      A1 = "OK"     Else      A1 = "NG"    End If    dd(i1, i2) = A1   Next i2 '配列をカウントするこの行以降の記述が良く分かりません。   ee(i1) = Application.WorksheetFunction.CountIf(dd(), "OK")  Next i1  Range(e).Resize(myLastRow) = ee End Sub

  • VBAで関数を使うには?

    こんな感じだったとします。   A1      B1 2002/9/2 2002/9/3 2002/9/4 2002/9/5   : このB1にそれぞれの曜日を表示させるVBAを以下のようにしました。 Sub youbi() Dim i As Integer For i = 3 To 10 Cells(i, 3).Value = Weekday(Cells(i, 2), "aaa") Next End Sub もちろんエラーでした。 (メッセージは「型が一致しません」です。) そこで以下のように変更しました。 Sub youbi() Dim i As Integer For i = 3 To 10 Cells(i, 3).Value = "=text(Weekday(b3), ""aaa"")" Next End Sub するときちんと曜日が表示されたのですが、もちろん全部B3のセルの日付の曜日です。 ここを変数にするにはどうしたらいいのでしょうか? とっても簡単なことのように思えますが、意外とハマってしまって抜け出せません。 よろしくお願いします。

  • 【Excel VBA】抽出したデータを書式へ

    Excel2003を使用しています。 Excelで作成→送付されてくる全店データの中から自店のデータのみを抽出し、全店データと同じ書式で自店のみのデータを作成したく、下記のようにコードを書きました。 ------------------------------------------------------- Sub Macro1() Dim i As Long Dim j As Long Dim LastR As Long LastR = Sheets("全店データ").Range("E65536").End(xlUp).Row With Sheets("自店データ")  For i = 34 To LastR   If Sheets("全店データ").Cells(i, "E").Value Like "*A店*" Then    .Cells(j, "C").Value = Sheets("全店データ").Cells(i, "C").Value    .Cells(j, "E").Value = Sheets("全店データ").Cells(i, "E").Value    .Cells(j, "I").Value = Sheets("全店データ").Cells(i, "I").Value    .Cells(j, "W").Value = Sheets("全店データ").Cells(i, "W").Value    .Cells(j, "AA").Value = Sheets("全店データ").Cells(i, "AA").Value    .Cells(j, "AE").Value = Sheets("全店データ").Cells(i, "AE").Value    .Cells(j, "AI").Value = Sheets("全店データ").Cells(i, "AI").Value    .Cells(j + 1, "C").Value = Sheets("全店データ").Cells(i + 1, "C").Value    .Cells(j + 1, "I").Value = Sheets("全店データ").Cells(i + 1, "I").Value    j = j + 2   End If  Next i End With End Sub ------------------------------------------------------- 元の書式は、データ1件が2行で、結合セルも含まれているので、コピペするより、Value = Value が扱いやすい(?)かと思い、上記のように書いてみました。 自店のデータが1ページ分(14件分28行で、セル34行目~61行目)内に収まる場合は問題ないのですが、それ以上になった場合をどのように記述すればよいのか躓いています。 書式は、  1ページ目 34行目~61行目  2ページ目 73行目~128行目  3ページ目 140行目~195行目  4ページ目 207行目~262行目  5ページ目 274行目~329行目  6ページ目 341行目~396行目 このような書式にデータを代入する場合は、上記の方法では難しいでしょうか? 説明が分かりづらくて申し訳ありませんが、よろしくお願いします。

  • 【VBA】 IFの中にIF

    いつもこちらの識者の方々にはお世話になっています。 VBAの質問です。 やりたいことは下記構文を見ていただければわかると思うのですが、 ------------------------------------------------------------------------------ Sub Test() Dim f As Long Dim lRow As Long lRow = Cells(Rows.Count, 1).End(xlUp).Row For f = lRow To 2 Step -1 If Cells(f, 2).Value = "りんご" Then Cells(f, 2).EntireRow.Delete Else Cells(f, 2).Value = Cells(f, 2) & "0" & Cells(f, 3) Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif End If Next f End Sub ------------------------------------------------------------------------------ Cells(f, 18).Value = If Cells(f, 4).value = 1 Then Cells(f, 13) Else Cells(f, 14) Endif の部分が解決したい部分になります。 IFで条件分岐したあとの処理にさらにIFで分岐を加えたいのですが、無茶だと思いつつやってみたらやはり通りませんでした。 こういうのはなんというのでしょうか、ネストとも違うと思うのですが・・・ 上記のような場合、どのような構文が適していますでしょうか。

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

専門家に質問してみよう