[三流君] −−>
[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でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
フィードバック
VBA系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列
情報を探す
情報を探すならGoogleかな?
↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・