くるりから届けられた4年ぶりのニューアルバム!!

EXCELのVBAでSQLの

SELECT COUNT(DISTINCT(ITEMS)) FROM TABLE
WHERE SHOP = 'A'

と同様のことを行いたいのですが、どのように考えたらよいでしょうか。
同じようなことができる関数でもよいです。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

>同じようなことができる関数でもよいです


これを質問に入れたために質問の意図がぼやけました。
エクセルの関数は、値を加工したり、1つ持って来たり
は出来ますが、レコードの取得という考えは出来ません。
例えばDGETなど、それらしい名前の関数もありますが、1フィールドの値だけしか返しません。
1レコードの全項目を項目ごとに取ってくれば1レコード分は揃えられると思いますが。
件数合計や計数合計なら計算できる可能性はあります。
質問には「COUNT」となっているので、出来る可能性は
あります。今すぐ思いつくのは、作業列を使いますが
(後述)。
>SQL
アクセスVBAで出来るごとく、エクセルVBAでもオブジェクト(=プログラム)の参照設定をやる方法を会得すれば、SQL文の実行が出来ます。コード作成・実行環境VBEがアクセスのものを使うかエクセルのVBEであるかの違いと思います。
当然既設定のソフト環境が違いますので、知識が要ります。
エクセルでも、「クエリ」でヘルプで照会してみると、
「外部データベースからデータを抽出する方法」
など載ってます。DISTINCTが使えるかどうか不知。
>WHERE SHOP = 'A'とDISTINCT
VBAでやればソートしておき、各レコードに付いてShopがAか判別し、ITEMキーが変化するごとに1だけカウントアップさせる方法が簡単でしょう。
(関数での回答例)取り急ぎでベターな回答か判りませんが。
(データ例)A2:B12(C,Dは関数式を入れた結果を先まわりに掲出したもの)
A列  B列    C列   D列
ax a x  1
ay a y  1
bz b z  1
by b y  1 
ax a x  2
az a z  1
ax a x  3
bu b u  1
cv c v  1
cx c x  1
ay a y  2
(関数式)作業列
C2に=LEFT(" ",4-LEN(A2))&A2&LEFT(" ",5-LEN(B2))&B2
A列は4桁以内のコードか文字列、B列は5桁以内のコードか文字列と仮定。結合したキーを作る際に桁合わせをしているもの。
C3以下に式を複写する。
D2に=COUNTIF($C$2:C2,C2)
D3以下に式を複写する。
上記セル以外に
=SUMPRODUCT((A1:A12="a")*(D1:D12=1))
結果は3です(a-x,a-y,a-zの組み合わせ)。
(アドバイス)
質問文に「SQL」「DISTINCT」などを出しているが、エクセル上手の方がみんなSQLを理解できるかどうか疑問。
質問として、エクセルのカテで、文章で「A列がaで、且つA列とB列のデータを組み合わせて、重複分を除く件数のカウントの関数式」とでも質問した方が良いのではなかったでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました。
アドバイスまで頂きましたが、
SQLを理解している人に回答頂ければ結構だとおもいました。
家庭向けではなく技術者向けに質問すべきだったかもしれません。

お礼日時:2004/12/25 08:20

エクセルの表をSQLのデータソースとして、そのままSQLを発行して求めることはできます。


ヘルプでSQLで検索してみて下さい。

それ意外に方法だと、簡単にはできないと思います。
最悪、質問文のSQLと同等の動作をするプロシージャーを作成しなければならないと思います。

ワークシート上である程度作業することで作業を軽減できるとは思います。
例えば、データの抽出で重複をしないで、抽出しデータ数を数えるとか

DCOUNTAとCOUNTIFを複合して求めることもできると思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
結果、SQL文と似たプロシージャーを作成しました。

お礼日時:2004/12/25 08:17

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル関数 重複をのぞいて個数を数える方法

いつもお世話になっています
セルに
a  b  c  a  b b
と入力したとき、個数を数える方法は知っていますが、種類が3個だと集計するにはどんな関数を使えばいいのでしょうか。

Aベストアンサー

下記URLの方法は如何でしょう。

「重複しないデータを数える」
http://integer.exblog.jp/2132536/

「リストから重複するデータをはぶいた件数(個数)をカウントする」
http://ameblo.jp/xls/entry-10073848203.html

「重複しないセル数」ユーザー定義関数の説明
http://www.katch.ne.jp/~kiyopon/soft/juhukunai.html

QEXCEL 重複するデータを1としてカウントする方法

以下のような、ある施設の利用者一覧表です。

A列には利用した日にち、B列には利用者のIDがあります。

A   | B
日にち | ID
01/10 | 0001
01/10 | 0002
01/13 | 0001
01/15 | 0003
01/17 | 0001

これをEXCELで延べ人数ではなく、同じIDが複数回出てきても1とカウントしたいのですが方法が分かりません。
上記の表では0001、0002、0003しかありませんので3という数字を求めたいのです。

出来れば作業列を使いたくないのですが、やむをえない場合はしょうがないかなと思います。

宜しくお願いします。

Aベストアンサー

#7です
◆すでに同じ回答をzap35さんがされていました
◆大変失礼しました

◆文字列または数値で途中空白があってもよい方法で別の式(少し長いですが)
=INT(SUMPRODUCT(1/SUBSTITUTE(COUNTIF(A1:A100,A1:A100),0,100)))

◆もし、ID番号が数値であればこんな方法も
=COUNT(1/FREQUENCY(A1:A100,A1:A100))

Qエクセル VBA セルの個数を所得する

いつも皆様には大変お世話になっております。

早速の質問ですが、

    A    B     C     D     E
1
2       123
3       123
4       123
5       123
6
7       123
とエクセルのセルがなっている場合の
上のB2から下のB7までのセルの個数を所得したいのです
B8以降にも数字が入る場合があるのと間に空白が入る場合があるので
困っています。
B2のセルは固定となっているのでB2からの判別で問題ない状況です。
どうぞ皆様お知恵をお借りしたく思っておりますのでよろしくお願いいたします。

Aベストアンサー

質問が非常に不明確なのですが・・・

所得?取得ですよね?

単にB2:B7のセルの個数をVBAで取得するなら
MsgBox Range("B2:B7").Count

B2:B7の空白でないセルの個数なら
MsgBox Application.CountA(Range("B2:B7"))

B7まででなくB2からB列のデータがある最後までのセル個数なら
MsgBox Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row).Count

B2からB列のデータがある最後までの空白でないセル個数なら
MsgBox Application.CountA(Range("B2:B" & Cells(Rows.Count, "B").End(xlUp).Row))

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

QExcel VBAで複数シートをコピーする

Excel VBAで複数のシートを新たらしいブックにコピーする方法が分かりません。

一応、Selectで全てのシートを選択し
コピーする方法は分かるのですが
出来ればSelectなどの画面遷移をプログラム内に含ませたくありません

シートは n件存在します。
ご存知の方がおられましたら
ぜひ、教えて頂けないでしょうか?

Aベストアンサー

すいません、勉強不足でした。
ただ単純に「全てのシートを選択」し「新規ファイルにコピー」という動作であれば、
sheets.Select
sheets.Copy
だけでできました。

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

QEXCEL VBAで行う複数の検索条件に合致する行の個数のカウント方法について

すいません EXCEL VBAで教えていただきたいことがあります。
   A列  B列
1行:野菜  秋物
2行:果物  秋物
3行:穀物  夏物
4行:野菜  夏物
5行:野菜  春物
6行:穀物 秋物
7行:果物  夏物
8行:野菜  秋物
・・・以下300行まで続く

というデータがあるとして、A列が「野菜」、B列が「秋物」に合致する
行の合計個数をカウントするのはどうしたらよろしいんでしょうか。
関数だとデータベース関数を使えば何とかできそうな感じなのですが
VBAだと、どうもいいアイデアが浮かびません。よろしくお願いいたします。

Aベストアンサー

300行程度だとどれでもそんなに大きい差(処理時間)はありませんでした。
'=========================================================
Sub 例1()
  Dim c1 As String
  Dim c2 As String
  Dim ans As Long
  c1 = "野菜": c2 = "秋物"
  With Range("a1", Cells(Rows.Count, "a").End(xlUp)).Resize(, 2)
   ans = Evaluate("sumproduct((" & .Columns(1).Address & "=""" & c1 & _
            """)*(" & .Columns(2).Address & "=""" & c2 & """))")
   MsgBox c1 & "で" & c2 & "の数は " & ans
   End With
'私は、この手のことは、大抵これです
End Sub
'=========================================================
Sub 例2()
  Dim c1 As String
  Dim c2 As String
  Dim ans As Long
  ans = 0
  c1 = "野菜": c2 = "秋物"
  With Range("a1", Cells(Rows.Count, "a").End(xlUp)).Resize(, 2)
   With .Columns(3)
     .Formula = "=if(and(rc[-2]=""" & c1 & _
             """,rc[-1]=""" & c2 & """),1,"""")"
     If .Rows.Count = 1 And .Cells(1).Value = 1 Then
      ans = 1
     Else
      On Error Resume Next
      ans = .SpecialCells(xlCellTypeFormulas, xlNumbers).Count
      End If
     MsgBox c1 & "で" & c2 & "の数は " & ans
     .ClearContents
     End With
   End With
End Sub
'============================================================
Sub 例3()
  Dim c1 As String
  Dim c2 As String
  Dim crng As Range
  Dim ans As Long
  ans = 0
  c1 = "野菜": c2 = "秋物"
  For Each crng In Range("a1", Cells(Rows.Count, "a").End(xlUp))
   With crng
     If .Value = c1 And .Offset(0, 1).Value = c2 Then ans = ans + 1
     End With
   Next
  MsgBox c1 & "で" & c2 & "の数は " & ans
End Sub

300行程度だとどれでもそんなに大きい差(処理時間)はありませんでした。
'=========================================================
Sub 例1()
  Dim c1 As String
  Dim c2 As String
  Dim ans As Long
  c1 = "野菜": c2 = "秋物"
  With Range("a1", Cells(Rows.Count, "a").End(xlUp)).Resize(, 2)
   ans = Evaluate("sumproduct((" & .Columns(1).Address & "=""" & c1 & _
            """)*(" & .Columns(2).Address & "=""" & c2 & """))")
   MsgBox c1...続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

QエクセルVBAでフィルタ抽出部分のみのコピー

エクセルVBAで売上帳を作成していますが、オートフィルタでデータ抽出した後、表示されている行のみをコピーして別シートに貼りつけるにはどうすればよいのでしょう?

別シートは指定したセルに値のみの貼り付けをしたいと思っています。

宜しくお願いします。

Aベストアンサー

こんにちは
マクロの記録で作成した一例です。コメントを読んで、適当にアレンジして下さい。

Option Explicit
Sub SampleMacro1()
'
' SampleMacro1 Macro
' マクロ記録日 : 2009/3/13
'
 'フィルター部分
 Selection.AutoFilter Field:=1, Criteria1:="=ほげほげ", Operator:=xlAnd
 '可視セルの選択
 Selection.SpecialCells(xlCellTypeVisible).Select
 '選択範囲のコピー
 Selection.Copy
 'コピー先のシート&セル選択
 Sheets("Sheet2").Select
 Range("A1").Select
 'ペースト
 ActiveSheet.Paste
 'コピー元シートに戻りコピー状態解除
 Sheets("Sheet1").Select
 Application.CutCopyMode = False
 Range("A1").Select
End Sub

外してたら、ごめんなさい

こんにちは
マクロの記録で作成した一例です。コメントを読んで、適当にアレンジして下さい。

Option Explicit
Sub SampleMacro1()
'
' SampleMacro1 Macro
' マクロ記録日 : 2009/3/13
'
 'フィルター部分
 Selection.AutoFilter Field:=1, Criteria1:="=ほげほげ", Operator:=xlAnd
 '可視セルの選択
 Selection.SpecialCells(xlCellTypeVisible).Select
 '選択範囲のコピー
 Selection.Copy
 'コピー先のシート&セル選択
 Sheets("Sheet2").Select
 Range("A1").Select
 'ペース...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング