[三流君] −−> [VBAで楽しく] −−> [バックナンバー一覧]
−−> No.077 Not演算子で細工する、プログラムはパズルのように...

Not演算子で細工する、プログラムはパズルのように...

メルマガ発行内容

<Not演算子で細工する、プログラムはパズルのように...>

こんにちは、三流プログラマーKen3です。 今回は、 Not演算子を使って細工する方法を書きます。 少し本題へ行く前置きが長いけど、 最後まで読んでもらえるとなんとなく、書きたかったことがわかると思います。

/* * 1.今回のキッカケ */

ASP系のメルマガで、StrConvが使えなかったので、 文字数のカウント処理を自作で作って遊んでました。 そのコードに対して、下記のメールをもらいました。 In message "re:[ASPで遊ぶ No.052] - キャラクタコード....", > 二年目プログラマーの西 ***です。 >> nCODE = Asc(Mid(strMOJI, n, 1)) 'n番目の文字コードを求める >> If nCODE >= 0 And nCODE <= 255 Then 'コードが1バイト文字内か? > > 三流だとAnd演算子も知らない?ありえねぇ〜 --- いつものありがたい、ご意見/クレーム?メールをいただきました。 本名でクレーム書いて来るって、潔いよね。 (実は本名じゃなかったりして、、、  西多摩雄とかニシタマオだったら相手にしないんだけど) そんな関係ない話は置いといて、

/* * 2.問題のコードとAnd演算子の使い方 */

'文字列を受け取り、バイト数を返す
Function Byte_Count(strMOJI)
  bcnt = 0
  '文字数分ループして、コードを表示
  For n = 1 To Len(strMOJI)
    nCODE = Asc(Mid(strMOJI, n, 1))  'n番目の文字コードを求める
    If nCODE >= 0 And nCODE <= 255 Then  'コードが1バイト文字内か?
      bcnt = bcnt + 1
    Else
      bcnt = bcnt + 2
    End If
  Next
  'リターン値をセットする
  Byte_Count = bcnt
End Function
指摘場所は、バイト数を計算している関数内の nCODE = Asc(Mid(strMOJI, n, 1)) 'n番目の文字コードを求める If nCODE >= 0 And nCODE <= 255 Then 'コードが1バイト文字内か? bcnt = bcnt + 1 Else bcnt = bcnt + 2 End If の場所ですね。 まぁ、 If nCODE >= 0 And nCODE <= 255 Then 'コードが1バイト文字内か? でも、動いているのですが、たぶん美的意識、美観的に良くない、 nCODE And &HFF00 とAnd演算子を使用してマスクしろって感じなんだろうなぁ。 えっ、Andって演算子だったの? そうですよ?知らなかった? nCODE >= 0 And nCODE <= 255 をわかり易くするために、まず()を付けます、 (nCODE >= 0) And (nCODE <= 255) (True) And (True) みたいに、演算してるんですね(論理演算だけど) And &hFF00とすることで、 上のビットを残し、下のビットを消すなんてことが出来るんですね。 If nCODE >= 0 And nCODE <= 255 Then 'コードが1バイト文字内か? を If (nCODE And &HFF00) = 0 Then 'コードは1バイトか? *asp055 みたいに書くことができます。 0以上で255(含む)より下か?とIf文を作成して、 1バイトか?判断するのもありだし、 FF00でAndして、判断するのもひとつの手なんですよ。 今回は、好みの問題ってことであまり実害は無いけど、 And演算子、頭のスミに入れて置いてください。 http://www.ken3.org/cgi-bin/test/test055-1.asp?DATA=Ken3%82%CD%8EO%97%AC で、And &HFF00バージョンの確認ができます。 ※同じく動作することを確認してみてください。

/* * 3. Not演算子を使って細工する */

なんて書いて、ASP系と同じだと発行回数稼ぎになってしまうので、 (発行数稼いでも意味無いんだけど) Not演算子について書きます。 ~~~~~~~~~ Not演算子?あまり三流君のプログラムでは、見かけないよね。 でも、一流どころのHPに行くとよく見かけるよね。 ギク、痛いとこ突くなぁ。(笑) 使い方は簡単で、結果が逆になると思ってくれれば、わかりやすいかなぁ。 ファイルの終わりまでのループをEofでチェックしてます。 EOF=Trueはファイルエンド EOF=Falseはまだファイルエンドになっていない時の状態です。 私のいつもの書き方だと、 Do While Rs.EOF = False と、.EOFがFalseの時ループと書いてます。 よくみかけるプロらしい書き方は、 Do While Not Rs.EOF と、Rs.EOFの値をNotで逆にして条件で使用してます。 見た目もノットファイルエンドと読んだまま、そのままです。 まぁ、これも、好みと言えば逃げられちゃうけど(どちらでもいいけど) 1つ前回作ったプログラムでラベルと実データの表示を切り替える処理がありました。 Private pFLG As Boolean '印刷制御フラグ
Private Sub ページヘッダー_Format(Cancel As Integer, FormatCount As Integer)
    pFLG = False  '印刷してないに設定する
End Sub
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
               'ここにラベルのOn/Off処理を入れる
            Me![lab01].Visible = True
            Me![lab02].Visible = True
               '実データをOff
            Me![ID].Visible = False
            Me![WrietTime].Visible = False
            Me![F_TITLE].Visible = False
            Me![F_MEMO].Visible = False
        Else
               'ここにラベルのOn/Off処理を入れる
            Me![lab01].Visible = False
            Me![lab02].Visible = False
               '実データをOff
            Me![ID].Visible = True
            Me![WrietTime].Visible = True
            Me![F_TITLE].Visible = True
            Me![F_MEMO].Visible = True
        End If
    Else
        pFLG = False  'その他の時
    End If

End Sub
よく見ると、同じような代入処理が見つかります。 ラベルがTrueの時、実データをFalse ラベルがFalseの時、実データをTrue とセットしてます。 ※まぁ、どちらか1つの印刷だから。 さてと、下記のようにNot演算子を使用して、細工してみます。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
    If (Me![cntA] Mod 3) = 1 Then  '左端なら
        'フラグを使用して可視/不可視をセットする
        Me![lab01].Visible = Not pFLG  'ラベルはフラグの逆をセット
        Me![lab02].Visible = Not pFLG
        '実データ
        Me![ID].Visible = pFLG         '実データにはフラグそのままセット
        Me![WrietTime].Visible = pFLG
        Me![F_TITLE].Visible = pFLG
        Me![F_MEMO].Visible = pFLG
        
        If pFLG = False Then 'まだラベルエリアを印刷してなかったら
            Me.NextRecord = False      'レコードの移動をまず止める
            pFLG = True  '印刷フラグを立てる
        End If
    Else
        pFLG = False  'その他の時
    End If

End Sub
pFLGの印刷フラグの意味を、実データ印刷として、 ラベルにはNot pFLGをセット、実データにはそのままpFLGをセットして、 可視/不可視の切り替えを行ってます。 flg=True(男性)/False(女性)なんてデータの時 If flg=True Then '男性/女性の判断 Me![男性].Visible = True Me![女性].Visible = False Else Me![男性].Visible = False Me![女性].Visible = True End If とやってもいいし、 下記のようにNot演算子を使用して、 Me![男性].Visible = flg Me![女性].Visible = Not Flg で切り替える、そんな小細工もプログラマー的には、アリですよ。

/* * 4.おわりの挨拶 */

今回は、 ・And演算子の説明 ・Not演算子の説明 ・Not演算子でセットする値を逆にして小細工してみた って話でした。 拾い読みして、 1つでも何かの参考となれば幸いです。 Excel/Access大好き、三流プログラマーKen3でした。 ※評価は↓で投票してね。感想は掲示板かメールでくださいね。


ページフッター

ここまで、読んでいただきどうもです。ここから下は、三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、

種類別のリンク や 広告など

気になったジャンル↓を選択してください。

人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。

Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です

Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です

その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます

開発時の操作: [F1を押してHELPを見る]/ [Debug.Print と イミディエイトウインドウ]/ [実行時エラーでデバッグ]/ [ウォッチ式とSTOP]/ [参照設定を行う]

仕様書(設計書?) XXXX書類: [基本設計書や要求仕様書]/ [テスト仕様書 テストデータ]/ [バグ票]/ [関数仕様書]/ [流れは 入力・処理・出力]

※↑文章の味付けが変わっていて、お口に合うかわかりませんが。。。
※※読んで、気分を悪くされたらスミマセン。

Blogとリンク:[三流君の作業日記]/ [VBAやASPのサンプルコード]/ 広告-[通販人気商品の足跡]



[三流君(TOP ken3.org へ戻る)] / [VBA系TOPへ] / [VBA系バックナンバー目次へ移動]