ACCESSで最小公倍数を求める方法

このQ&Aのポイント
  • ACCESSで最小公倍数を求める方法について解説します。
  • データベースにキー項目と数値がある場合、それらの最小公倍数を求めて更新する方法をご紹介します。
  • ACCESSには最小公倍数を求めるための組み込み関数はありませんが、VBAを使用すれば簡単に計算できます。
回答を見る
  • ベストアンサー

accessで最小公倍数を求める

ACCESSで最小公倍数を求めた値をセットしたいのです データとしては キー項目 数値 A     2 A     3 A     2 B     1 B     3 C     2 とあったとしてキー項目単位で求めた最小公倍数をセットしたデータを updateしたいのです キー項目 数値 最小公倍数 A     2     6 A     3     6 A     2     6 B     1     3 B     3     3 C     2     2 このような更新クエリーを作りたいのですが 最小公倍数の関数がEXCELならLCMというのがあるみたいですが ACCESSには見つからなかったので・・・ データが大量にあるのでACCESSで処理したいのですが いい方法がありましたらアドバイス下さい

  • nobi12
  • お礼率76% (183/239)

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

No1の訂正です。 >一応、数値が0であったり、抜けている場合は無視するように >しています。 の処理が不十分なコードを載せていました。以下のようにしてください。 Sub cmdxy()   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim varArray() As Variant   Dim i As Long   Dim j As Long   Dim lnNum As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("テーブル1", dbOpenDynaset)   Set rs2 = db.OpenRecordset("Qキー項目")   rs2.MoveFirst   Do Until rs2.EOF     'カウンタ、及び配列の初期化     i = 0     ReDim Preserve varArray(0)     'データの取込     rs1.MoveFirst     Do Until rs1.EOF       If rs1!キー項目 = rs2!キー項目 Then         If IsNull(rs1!数値) Or rs1!数値 = 0 Then         '何もしません         Else           varArray(i) = rs1!数値           ReDim Preserve varArray(UBound(varArray) + 1)           i = i + 1         End If       End If       rs1.MoveNext     Loop     '最小公倍数の計算     lnNum = varArray(0)     For j = 0 To UBound(varArray) - 1       lnNum = funcLCM(lnNum, varArray(j))     Next     '最小公倍数の書き込み     rs1.MoveFirst     Do Until rs1.EOF       If rs1!キー項目 = rs2!キー項目 Then         If IsNull(rs1!数値) Or rs1!数値 = 0 Then         '何もしません         Else           rs1.Edit           rs1!最小公倍数 = lnNum           rs1.Update         End If       End If       rs1.MoveNext     Loop     Erase varArray     rs2.MoveNext     Loop   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing End Sub No1の関数、およびこのプロシージャを 標準モジュールに保存し、No1での使用方法で 実行してみてください。

その他の回答 (2)

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

解決されていない認識で良かったでしょうか、 piroin654 さんと変わり映えしませんが回答してみます。 元々のテーブル名を「TC」と仮定します。 以下を標準モジュールに記述しておきます。 Public Function TCLCM(vCode As Variant) As Long   Dim rs As New ADODB.Recordset   Dim iNum As Long, i As Long, j As Long, iTmp As Long   iNum = 0   rs.Source = "SELECT 数値 FROM TC WHERE 項目='" & vCode & "';"   rs.Open , CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly   Do While (Not rs.EOF)     If (IsNull(rs(0))) Then       iNum = 0       Exit Do     ElseIf (rs(0) < 1) Then       iNum = 0       Exit Do     End If     i = rs(0)     If (iNum = 0) Then       iNum = i     Else       j = iNum       While (i)         iTmp = j Mod i         j = i         i = iTmp       Wend       iNum = iNum * rs(0) \ j     End If     rs.MoveNext   Loop   rs.Close   TCLCM = iNum End Function クエリは何種類かあって、表示上だけであれば 1) 更新/追加(項目・数値)したい場合 SELECT 項目, 数値, TCLCM(項目) AS 最小公倍数 FROM TC; 2) 単に表示すれば良い場合 SELECT Q1.項目, Q1.数値, Q2.最小公倍数 FROM TC AS Q1 INNER JOIN (SELECT 項目, TCLCM(項目) AS 最小公倍数 FROM TC GROUP BY 項目) AS Q2 ON Q1.項目 = Q2.項目; 2) の方が作った関数を呼ぶ回数が少ないので速いかも・・・・ テーブル「TC」のフィールド「最小公倍数」に値を設定する場合 UPDATE TC SET 最小公倍数 = TCLCM(項目); ※ 「キー項目」という項目名は、面倒だったので「項目」にしていました。 ※ 処理性能はわかりません。参考にする/しない等々自己責任にてお願いします。

nobi12
質問者

お礼

ありがとうございます こんな方法もあるのですね 勉強になります

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

誰かが回答すると思っていたのですが・・・・。 Excelの最小公倍数を求める関数をAccessから利用する 方法は以下にあります。 http://support.microsoft.com/kb/198571/ja そこでこの関数が役に立つか確認したところ、 1 反応がものすごく遅い。およそ1秒かかる。 2 0を入れると最小公倍数が0で返ってくる。 1は一回きりの計算ならば、気長に待てばいいかもしれません。 2はデータの取得の方法を工夫すればいいのかもしれません。 で、更新クエリなんぞでこの関数を利用した方法が可能か 考えてみましたが、大風邪の真っ最中なので思考停止。 あっさりVBAでグリグリ行く方法を載っけます。 まず、クエリを一つ。これはキー項目の名寄せをします。 Qキー項目 という名前で保存してください。テーブル名は実際に合わせて 変更してください。 SELECT テーブル1.キー項目 FROM テーブル1 GROUP BY テーブル1.キー項目; 以下は標準モジュールに。 最大公約数と最小公倍数を求める関数を。 比較する数値の個数がキー項目ごとに変動 するようなので少し工夫が必要ですが。 Private Function funcGCM(ByVal x As Long, Optional ByVal y As Long) As Long   If y = 0 Or IsNull(y) Then     funcGCM = x   Else     funcGCM = funcGCM(y, x Mod y)   End If End Function Function funcLCM(ByVal x As Long, ByVal y As Long) As Long   funcLCM = x * y / funcGCM(x, y) End Function 次に、実行するプロシージャを。コード中のテーブル名は実際に 合わせて変更してください。 一応、数値が0であったり、抜けている場合は無視するように しています。 Sub cmdxy()   Dim db As DAO.Database   Dim rs1 As DAO.Recordset   Dim rs2 As DAO.Recordset   Dim varArray() As Variant   Dim i As Long   Dim j As Long   Dim lnNum As Long   Set db = CurrentDb   Set rs1 = db.OpenRecordset("テーブル1", dbOpenDynaset)   Set rs2 = db.OpenRecordset("Qキー項目")   rs2.MoveFirst   Do Until rs2.EOF     'カウンタ、及び配列の初期化     i = 0     ReDim Preserve varArray(0)     'データの取込     rs1.MoveFirst     Do Until rs1.EOF       If rs1!キー項目 = rs2!キー項目 Then         If Not IsNull(rs1!数値) Or Not rs1!数値 = 0 Then           varArray(i) = rs1!数値           ReDim Preserve varArray(UBound(varArray) + 1)           i = i + 1         End If         End If       rs1.MoveNext     Loop     '最小公倍数の計算     lnNum = varArray(0)     For j = 0 To UBound(varArray) - 1       lnNum = funcLCM(lnNum, varArray(j))     Next     '最小公倍数の書き込み     rs1.MoveFirst     Do Until rs1.EOF       If rs1!キー項目 = rs2!キー項目 Then         If Not IsNull(rs1!数値) Or Not rs1!数値 = 0 Then           rs1.Edit           rs1!最小公倍数 = lnNum           rs1.Update         End If       End If       rs1.MoveNext     Loop     Erase varArray     rs2.MoveNext     Loop   rs1.Close: Set rs1 = Nothing   rs2.Close: Set rs2 = Nothing   db.Close: Set db = Nothing End Sub なお、DAOを使っているので、コード表のツール→参照設定で Microsoft DAO xx Object Library にチェックを入れてください。xxは3.6のような数字です。 使用法は、cmdxyをイミディエイトウィンドウで実行するか、 あるいは、フォームのボタンクリックで、 Call cmdxy とするかです。 わからないところがあれば補足してください。

nobi12
質問者

お礼

ありがとうございます 手作業で計算しなきゃ・・・とあきらめるところでしたが 無事大量データを短時間で処理する事ができました

関連するQ&A

  • 最小公倍数

    次の整式の組の最小公倍数を求めよ。 4(a^2)bc^3 、 6(a^3)(b^2)cd 私の解答は (12a^3)(b^2)(c^3)  としましたが、問題集の解答には (12a^3)(b^2)(c^3)d になっていました。 私が(12a^3)(b^2)(c^3) と解答した理由は参考書に、「2つ以上の整式に共通な倍数を公倍数といい、そのうちで次数が最小のものを最小公倍数という。」と書いてありdは2つ以上の整式に共通ではないと思ったからです。 なぜdも最小公倍数に含まれているのか教えてください。

  • エクセルで2数の最小公倍数を求めるには

    お世話になります。 A1とB1に入力した数値の最小公倍数をC1に求める式はどのようになりますか 宜しくお願いします

  • 最小公倍数の計算

    最小公倍数の計算 (a-b)(a-c),(b-a)(b-c),(c-a)(c-b)の最小公倍数を求める問題です (a-b)(a-c)= -(a-b)(c-a) (b-a)(b-c)= -(a-b)(b-c) (a-c)(b-c)= -(c-a)(b-c) と変形させて (a-b)^3(b-c)^3(c-a)^3 が答えになりますが、答えにマイナスがなぜつかないんですか? お願いします。

  • 数A 最小公倍数

    最小公倍数の問題について質問です。 4stepという問題集のA演習問題28です。 解答の一部分が分からないので抜粋します。 (問)aとbの最小公倍数は720(=2⁴×3²×5)である。 (解)b=2²×3²のとき、aとbの最小公倍数は720(=2⁴×3²×5)であるから、 aは素因数2を4個、素因数5を1個もつ。 この部分の理由が分かりません! 分かる方がいらっしゃいましたら教えてください!

  • EXCELの最大公約数、最小公倍数の関数でエラー

    EXCEL2003を使っています。 最小公倍数、最大公約数を求めようと思って、 =LCM(4,6) =GCD(4,6) などと入力すると、#NAME? とエラーが出ます。 何がいけないのでしょうか。

  • 最小公倍数最大公約数

    WindowsN88BASICのプログラムについてしつもです。 自然数a、b、cをインプットしa、b、cの最小公倍数と最小公倍数を出力するBASICプログラムを作りたいのですが、教えていただけますか? cプログラムでは同じ事をできたのですが、最近BASICを始めたので考え方等と共に解説お願いします。

  • 整式の最小公倍数

    整式A=x^2-1,整式B=x^2+2x+1の最小公倍数を求める問題です。 両整式を因数分解して整式A=(x+1)(x-1),整式B=(x+1)^2となり、最大公約数は共通している(x+1)というのは分かったんです。 では、最小公倍数は最大公約数(x+1)と残っている(x-1)を書けばいいだけなのですか?

  • 最大公約数と最小公倍数の関係

    ある二つの正の整数の最大公約数と最小公倍数をかけたものは、元の二つの数字をかけたものと等しいっていうことは言えますか? つまり、最大公約数をgcd、最小公倍数をlcmとあらわすことにして、 正の整数mとnについて、    gcd(m , n)・lcm(m , n)=m・n は成り立つかどうかを教えてください。 できればその理由(証明)も添えてください。 協力お願いします!!

  • 整数論、公倍数について

    [a,b,c]=[[a,b],c]を示せと言う問題です。 aの公約数の集合をA(a)で表すと、a,bの公倍数の集合はA(a)∩A(b)で表される。 同様にして、a,b,cの公倍数の集合はA(a)∩A(b)∩A(c)で表され、[a,b]とcの公倍数の集合は、[a,b]の倍数の集合∩A(c)で表される。    ここで、[a,b]はa,bの最小公倍数であるから、[a,b]の倍数とはa,bの公倍数のことである。 したがって、[a,b]の倍数の集合=A(a)∩A(b)である。    よって、右辺=[a,b]の倍数の集合∩A(c)        =(A(a)∩A(b))∩A(c)        =A(a)∩A(b)∩A(c)        =左辺 というような感じでいいのかなと思ったのですが、この問題、数式で証明しようと思ったらどのようにすればよいのでしょうか?教えてください。 イメージとしてはa、b、cの最大公約数をkとおくとみたいな流れでの証明方法です。宜しくお願いします。

  • 最大公約数と最小公倍数

    この問題のことが分かりません教えてください(>_<) 44、78、112のどの数も自然数Aで割ると10余り これは最大公約数で解く 自然数Bを12、18、30のどの数で割っても3余る これは最小公倍数で解く どういう理屈で最大公約数と最小公倍数を使い分けるのですか?