Excel VBA質問箱 IV

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

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


13591 / 13646 ツリー ←次へ | 前へ→

【4509】論理演算を行う関数について ユウキ 03/3/25(火) 9:59 質問
【4536】Re:論理演算を行う関数について hira 03/3/26(水) 2:22 回答
【4638】Re:論理演算を行う関数について ユウキ 03/3/31(月) 13:53 発言
【4646】Re:論理演算を行う関数について hira 03/4/1(火) 4:08 回答
【4680】Re:論理演算を行う関数について ユウキ 03/4/2(水) 16:33 発言
【4722】Re:論理演算を行う関数について ユウキ 03/4/3(木) 17:25 お礼

【4509】論理演算を行う関数について
質問  ユウキ  - 03/3/25(火) 9:59 -

引用なし
パスワード
   おはようございます。
論理演算についての質問ですが、文字列の引数を持ち、
論理演算NOTした文字列を戻り値として返す関数(NOTモジュール)を
作ろうと思うのですがなかなか案が浮かばず知恵を貸してください。

目的としたらビット反転などが主です。
他にもXOR、OR、ANDなども予定しています。
どうかお願いします。

【4536】Re:論理演算を行う関数について
回答  hira  - 03/3/26(水) 2:22 -

引用なし
パスワード
   ▼ユウキ さん:
>おはようございます。
>論理演算についての質問ですが、文字列の引数を持ち、
>論理演算NOTした文字列を戻り値として返す関数(NOTモジュール)を
>作ろうと思うのですがなかなか案が浮かばず知恵を貸してください。
>
>目的としたらビット反転などが主です。
>他にもXOR、OR、ANDなども予定しています。
>どうかお願いします。

こんばんは。

ビット反転したコードが文字列として成り立つのか知りませんが、
UNICODEをそのまま反転でよければ、こんな感じでしょうか。

Function Sample1(s As String) As String
  Dim ss As String
  Dim i As Long
  ss = s
  For i = 1 To LenB(s)
    MidB$(ss, i, 1) = ChrB$(Not AscB(MidB$(ss, i, 1)))
  Next
  Sample1 = ss
End Function

Function Sample2(s As String) As String
  Dim b() As Byte
  Dim i As Long
  b = s
  For i = LBound(b) To UBound(b)
    b(i) = Not b(i)
  Next
  Sample2 = b
End Function

MsgBox Sample1((Sample1("ハンカク漢字123ABCABC「」")))
MsgBox Sample2((Sample2("ハンカク漢字123ABCABC「」")))
MsgBox Sample1((Sample2("ハンカク漢字123ABCABC「」")))
MsgBox Sample2((Sample1("ハンカク漢字123ABCABC「」")))
いずれも元に戻ります。

【4638】Re:論理演算を行う関数について
発言  ユウキ  - 03/3/31(月) 13:53 -

引用なし
パスワード
   hiraさんこんにちは、遅くなりました。(^^;)
早速試してみようと思いますが、処理の注釈など入れていただければありがたいのですが・・・
最終結果報告まで時間がかかるかと思いますが、
わからないことがあればまたよろしくお願いします。


▼hira さん:
>▼ユウキ さん:
>>おはようございます。
>>論理演算についての質問ですが、文字列の引数を持ち、
>>論理演算NOTした文字列を戻り値として返す関数(NOTモジュール)を
>>作ろうと思うのですがなかなか案が浮かばず知恵を貸してください。
>>
>>目的としたらビット反転などが主です。
>>他にもXOR、OR、ANDなども予定しています。
>>どうかお願いします。
>
>こんばんは。
>
>ビット反転したコードが文字列として成り立つのか知りませんが、
>UNICODEをそのまま反転でよければ、こんな感じでしょうか。
>
>Function Sample1(s As String) As String
>  Dim ss As String
>  Dim i As Long
>  ss = s
>  For i = 1 To LenB(s)
>    MidB$(ss, i, 1) = ChrB$(Not AscB(MidB$(ss, i, 1)))
>  Next
>  Sample1 = ss
>End Function
>
>Function Sample2(s As String) As String
>  Dim b() As Byte
>  Dim i As Long
>  b = s
>  For i = LBound(b) To UBound(b)
>    b(i) = Not b(i)
>  Next
>  Sample2 = b
>End Function
>
>MsgBox Sample1((Sample1("ハンカク漢字123ABCABC「」")))
>MsgBox Sample2((Sample2("ハンカク漢字123ABCABC「」")))
>MsgBox Sample1((Sample2("ハンカク漢字123ABCABC「」")))
>MsgBox Sample2((Sample1("ハンカク漢字123ABCABC「」")))
>いずれも元に戻ります。

【4646】Re:論理演算を行う関数について
回答  hira  - 03/4/1(火) 4:08 -

引用なし
パスワード
   >処理の注釈など入れていただければありがたいのですが・・・
確かに説明もなくコードだけで申し訳なかったのですが、

>>>関数(NOTモジュール)を作ろうと思うのですがなかなか案が浮かばず
との事でしたので、基本的な関数は作成できる方だと判断していますので、
実質3行のプログラムなんですが...


Sample1は文字列を1バイトずつ(1文字ずつではない)切り出して、そのコードを求め
NOT演算後、また文字列の同じ位置に戻す作業を文字列のバイト数分繰り返しています。

>Function Sample1(s As String) As String
>  Dim ss As String '作業用
>  Dim i As Long   'ループカウンタ
>  ss = s
  '文字列のバイト数分ループする
>  For i = 1 To LenB(ss) '←LenB(s)になっていたけどこのほうが良いですね
    '文字列のiバイト目の文字コードをNOT演算した文字にする
>    MidB$(ss, i, 1) = ChrB$(Not AscB(MidB$(ss, i, 1)))
>  Next
  '返り値のセット
>  Sample1 = ss
>End Function


Sample2はByte型の動的配列に文字列を代入できることを利用して、配列の要素ごとに
NOT演算後、文字列に戻しています。

>Function Sample2(s As String) As String
>  Dim b() As Byte '作業用バイト配列
>  Dim i As Long  'ループカウンタ
  '文字列(引数)をByte配列に代入
>  b = s
  'Byte配列の最小要素〜最大要素についてループ
>  For i = LBound(b) To UBound(b)
    '各要素のNOT演算
>    b(i) = Not b(i)
>  Next
  '返り値のセット(Byte配列を文字列に戻す)
>  Sample2 = b
>End Function

使用している関数の詳細についてはヘルプ等でご確認ください。

【4680】Re:論理演算を行う関数について
発言  ユウキ  - 03/4/2(水) 16:33 -

引用なし
パスワード
   注釈していただきありがとうございます。参考にさせていただきます。
まだまだ初心者な者でして日々理解していっている所です。
XORの話になるのですが、
エクセル上から読み込んだ文字列データ(ABC,0,DEF,0.1,GHI,1,・・・・)と
指定の固定文字列データ(XYZ)とをXORした結果を出力したいと思っています。
固定データから、元データのバイト長に合わせたデータを作る。元データをMバイト、固定データをNバイトとすると、生成するMバイトのデータは、元データを(M/Nの小数以下切り捨て)回数繰返し、余りバイトを加えた文字列にしたいのですが
この時はどんな風にすればいいのでしょうか?

【4722】Re:論理演算を行う関数について
お礼  ユウキ  - 03/4/3(木) 17:25 -

引用なし
パスワード
   下記のようにすることで出来ました。
Function Sample1()
  Dim ss As String '作業用
  Dim aa As String '作業用
  Dim bb(90) As String '作業用
  Dim i As Long   'ループカウンタ
  Dim j As Long
  Dim k As Long
  Dim x As String
  Dim y As String
  Dim data As String
  Dim Randmoji As String
    
  ss = "ABCDEFGH"
  aa = "Adrt"
  k = Len(aa)
  '文字列のバイト数分ループする
  For i = 1 To LenB(ss)
  j = j + 1
  Randomize
  Randmoji = Chr(Int((90 - 35 + 1) * Rnd + 65))

    '文字列のiバイト目の文字コードをNOT演算した文字にする
'    MidB$(ss, i, 1) = ChrB$(Not AscB(MidB$(ss, i, 1)))
    bb(i) = AscB(MidB$(ss, i, 1)) Xor AscB(MidB$(aa, j, 1))
     x = MidB$(ss, i, 1) '確認用
    y = MidB$(aa, j, 1) '確認用
    If j = LenB(aa) Then
      j = 0
    End If
    data = data & bb(i)
  Next
  '返り値のセット
  Sample1 = data
End Function

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