Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


10131 / 13644 ツリー ←次へ | 前へ→

【23506】8Bitの数の検索について あいんすと 05/3/24(木) 23:42 質問[未読]
【23507】Re:8Bitの数の検索について ちゃっぴ 05/3/24(木) 23:52 回答[未読]
【23508】Re:8Bitの数の検索について ichinose 05/3/25(金) 1:47 発言[未読]
【23518】Re:8Bitの数の検索について あいんすと 05/3/25(金) 13:12 質問[未読]
【23521】Re:8Bitの数の検索について ichinose 05/3/25(金) 14:13 発言[未読]
【23525】Re:8Bitの数の検索について あいんすと 05/3/25(金) 14:35 お礼[未読]

【23506】8Bitの数の検索について
質問  あいんすと  - 05/3/24(木) 23:42 -

引用なし
パスワード
   指定したBitが1または0かを判断するマクロを
作成したのですが、うまくいきません。

ちなみに以下の様に作成しました。

☆S_Bit1,S_Bit2は0〜7の整数(任意のBit)
 Flag1,Flag2は 0 か 1
 D_Label1,D_Label2は任意の項目の行番号
以上の変数については他で既に定義されています。

※2つの項目が空白になるセルの列番号は同じです。
※Functionで10進数から8桁の2進数の変換出来てます。(Dec2Bin)

'------------------------------------------------------
i = 2
Do Until Cells(i,Label1) = ""
'10進数から2進数(8桁)に変換
'フラグ1
dec1 = Cells(i,D_Label1)
Data1 = Dec2Bin(dec1)
'フラグ2
dec2 = Cells(i,D_Label2)
Data2 = Dec2Bin(dec2)

If Mid(Data1,(8-S_Bit1),1) = Flag1 And _
  Mid(Data2,(8-S_Bit2),1) = Flag2 Then
 
  N = i
  Exit Sub
End If
  i = i + 1
Loop

条件があるのにきちんとNを出してもらえません。
「F8」で確認してみたのですが、きちんと動作はしている様なのですが・・・
Midの使い方が間違っているのでしょうか?

【23507】Re:8Bitの数の検索について
回答  ちゃっぴ  - 05/3/24(木) 23:52 -

引用なし
パスワード
   そんな面倒なことしなくても…

Helpで「And, Or, Xor」等をお調べください。

そこにちゃんとBit演算についてかかれてますから…

【23508】Re:8Bitの数の検索について
発言  ichinose  - 05/3/25(金) 1:47 -

引用なし
パスワード
   ▼あいんすと さん、ちゃっぴさん、こんばんは。
ちゃっぴさんが言うとおり、もっと簡単に判断が出来るとおもいますが・・。

 Msgbox 5 and 2^2
 Msgbox 8 and 2^2

この2行の結果を見て考えてみて下さい。

ですが、あいんすとさんの考え方で解を出してからでも良いですよね?

>指定したBitが1または0かを判断するマクロを
>作成したのですが、うまくいきません。
>
>ちなみに以下の様に作成しました。
>
>☆S_Bit1,S_Bit2は0〜7の整数(任意のBit)
> Flag1,Flag2は 0 か 1
> D_Label1,D_Label2は任意の項目の行番号
>以上の変数については他で既に定義されています。
>
>※2つの項目が空白になるセルの列番号は同じです。
>※Functionで10進数から8桁の2進数の変換出来てます。(Dec2Bin)

見せていただいたコードだと
dec1に1が入っていた場合、
Dec2Bin(dec1)は、1ですよね?


MsgBox dec2bin(1)
MsgBox dec2bin(1, 8)

この違いでしょうか?


>
>'------------------------------------------------------
>i = 2
>Do Until Cells(i,Label1) = ""
>'10進数から2進数(8桁)に変換
>'フラグ1
> dec1 = Cells(i,D_Label1)
> Data1 = Dec2Bin(dec1)
>'フラグ2
> dec2 = Cells(i,D_Label2)
> Data2 = Dec2Bin(dec2)
>
>If Mid(Data1,(8-S_Bit1),1) = Flag1 And _
>  Mid(Data2,(8-S_Bit2),1) = Flag2 Then
> 
>  N = i
>  Exit Sub
>End If
>  i = i + 1
>Loop

【23518】Re:8Bitの数の検索について
質問  あいんすと  - 05/3/25(金) 13:12 -

引用なし
パスワード
   10進数から2進数(8桁)への変換するマクロは以下の様に作りました。

Function Dec2Bin(ByVal dec As Currency) As String

'8BIT対応(通常)
Dim tmp As String
  Do Until dec < 1
    tmp = dec / 2 - dec \ 2
    If tmp = 0 Then
      bin = "0" & bin
    Else
      bin = "1" & bin
    End If
    dec = dec \ 2
  Loop
'-----------------------------------------------------------
  If Len(bin) < 8 Then    'binが8文字より少ない場合
    Do Until Len(bin) = 8
    bin = "0" & bin     '8文字になるまで"0"を付ける
    Loop
  End If
'-----------------------------------------------------------
  Dec2Bin = bin
End Function

セルでDec2Bin(Dec1,8)でいいのですが、
元のデータを変えてはいけないので、
セルのデータが「0」なら「00000000」と
マクロの中で変換し、判断したいのでこの様な
回りくどいプログラムを作ってしまいました。

ですので、最初の質問に戻りますが、ANDが判断しないのは何故かな?
と思ったのです。

【23521】Re:8Bitの数の検索について
発言  ichinose  - 05/3/25(金) 14:13 -

引用なし
パスワード
   ▼あいんすと さん:
こんにちは。

>10進数から2進数(8桁)への変換するマクロは以下の様に作りました。
最初の投稿でDec2Binが自作の関数ならば、その旨を記述するか
コードを提示して下さいね!!
何の断りもなしにDec2Binと書かれれば分析ツールのそれだと思ってしまいます。
(分析ツールDec2Binで問題がないと思いますが)


>
>
>ですので、最初の質問に戻りますが、ANDが判断しないのは何故かな?
>と思ったのです。
i = 2
Do Until Cells(i,Label1) = ""
'10進数から2進数(8桁)に変換
'フラグ1
dec1 = Cells(i,D_Label1)
Data1 = Dec2Bin(dec1)
'フラグ2
dec2 = Cells(i,D_Label2)
Data2 = Dec2Bin(dec2)

If Mid(Data1,(8-S_Bit1),1) = Flag1 And _
  Mid(Data2,(8-S_Bit2),1) = Flag2 Then
 
  N = i
  Exit Sub
End If
  i = i + 1
Loop

このコードだけでは、あいんすとさんがFlag1やFlag2にどんな値を設定しているのか
わかりませんよね?それからCells(i,D_Label1)に何が入っているかも・・・。

例題として、セルにはxxxx、S_Bit1、S_Bit2、Flag1、Flag2には、それぞれxxx、・・
とはいっていた場合、結果、xxxとなる予定がyyyyにしかなりません。

という記述は必要だな!!
と、思いませんか?
Mid(Data1,(8-S_Bit1),1)は、文字列ですから、

Flag1には、
Flag1="0"
又は、
Flag1="1"

と設定しなければなりません

もし、
Flag1=0
とか
Flag1=1
としているのなら、

If val(Mid(Data1,(8-S_Bit1),1)) = Flag1 And _
  val(Mid(Data2,(8-S_Bit2),1)) = Flag2 Then


として下さい。

【23525】Re:8Bitの数の検索について
お礼  あいんすと  - 05/3/25(金) 14:35 -

引用なし
パスワード
   ▼ichinose さん:
▼ちゃっぴ さん:

説明不足のまま、質問していまい申し訳ありません。
Flag1、Flag2ともにStingで定義していましたので、
Flag1="0"とダブルコーテーションでくくらないといけなかったのですね。
以前読んだ本では数列はダブルコーテーションでくくっても数値として扱われる。
と書かれていたので、やっていませんでした。
あとValで数列に変換する方法ありがとうございます。
以下の文は非常に参考になりました。

>Mid(Data1,(8-S_Bit1),1)は、文字列ですから、
>
>Flag1には、
>Flag1="0"
>又は、
>Flag1="1"
>
>と設定しなければなりません
>
>もし、
>Flag1=0
>とか
>Flag1=1
>としているのなら、
>
>If val(Mid(Data1,(8-S_Bit1),1)) = Flag1 And _
>  val(Mid(Data2,(8-S_Bit2),1)) = Flag2 Then

10131 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free