Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10全般 : Access 2013)
BITAND関数
投稿日時: 18/08/31 20:21:38
投稿者: TOM57

エクセル関数でBITAND関数を使っていて、Accessに移行したいと
考えているのですが、AccessではBITAND関数は使えず…。
Accessの場合、どのようにしたらいいでしょうか。

回答
投稿日時: 18/08/31 21:51:21
投稿者: よろずや

普通に
数値1 AND 数値2
 でビット演算ができます。

回答
投稿日時: 18/09/03 11:18:37
投稿者: sk

TOM57 さんの引用:
エクセル関数でBITAND関数を使っていて、Accessに移行したいと
考えているのですが、AccessではBITAND関数は使えず…。
Accessの場合、どのようにしたらいいでしょうか。

BITAND と同じ機能を持つユーザー定義関数
作成するしかないでしょう。
 
よろずや さんの引用:
普通に
数値1 AND 数値2
でビット演算ができます。

それは VBA(モジュール)における And 演算子の話であって、
クエリ/フォーム/レポート/マクロ上で同じような式を
記述しても、ビット演算は行なわれません。
 
0 なら False、0 以外の数値なら全て True と見なした上で
論理積( True / False )を返すだけです。
 
(標準モジュール)
-----------------------------------------------------------------
Public Function BitAnd(ByVal Expression1 As Long, _
                       ByVal Expression2 As Long) As Long
                        
    BitAnd = (Expression1 And Expression2)
                        
End Function
-----------------------------------------------------------------
 
(クエリでの呼び出し例)
-----------------------------------------------------------------
 
ビット演算: BitAnd([数値型のフィールド1],[数値型のフィールド2])
 
-----------------------------------------------------------------

投稿日時: 18/09/03 12:05:36
投稿者: TOM57

よろずやさん、skさんありがとうこざいます。
 
試させていただいたのですが、
10桁以上だとオーバーフローになってしまうようです。
 
 
どうしたらいいでしょうか
 

回答
投稿日時: 18/09/03 14:48:43
投稿者: sk

引用:
10桁以上だとオーバーフローになってしまうようです。

長整数型( Long )で扱うことの出来る範囲
( -2,147,483,648 〜 2,147,483,647 )を超える数値の
ビット演算は、VBA の And 演算子では行なうことが出来ません。
 
・実際に扱う整数の範囲(最小値/最大値)は
 具体的にどこからどこまでであるか。
 (最大何ビットの演算を行なうのか)
 
・符号付きの整数(特に負の数)を含めた
 ビット演算を行なう必要があるか否か。
 (最上位ビットを符号として扱うか否か)
 
符号なしビット演算の場合は、例えば配列変数と
ループ処理を用いたコードに書き換えれば
一応は対応可能でしょう。

回答
投稿日時: 18/09/03 17:03:53
投稿者: よろずや

TOM57 さんの引用:
10桁以上だとオーバーフローになってしまうようです。
Public Function BITAND(ByVal arg1 As Double, ByVal arg2 As Double) As Double
    Const bound As Double = &H40000000
    Dim high1 As Long
    Dim low1 As Long
    Dim high2 As Long
    Dim low2 As Long
    high1 = arg1 / bound
    low1 = arg1 - high1 * bound
    If low1 < 0 Then
        high1 = high1 - 1
        low1 = arg1 - high1 * bound
    End If
    high2 = arg2 / bound
    low2 = arg2 - high2 * bound
    If low2 < 0 Then
        high2 = high2 - 1
        low2 = arg2 - high2 * bound
    End If
    BITAND = (high1 And high2) * bound + (low1 And low2)
End Function
エクセルと同じになるか十分にテストして下さい。

トピックに返信