三流君 VBAで楽しくプログラミング(Excel/Access VBAの解説/サンプルです)
[VBA系のバックナンバー]
[VBA系 TOP]
[三流君 TOP]
<空のMDBを作成後、DoCmd.CopyObjectでテーブルコピー>
こんにちは、三流プログラマーKen3です。
今回は、
Access2000〜でADOを使用した、
空のMDB作成方法
と
DoCmd.CopyObjectでテーブルコピー
です。
/*
* 1.今回のキッカケ
*/
下記の質問メールをもらいました。
----
In message "やばいです。",
m*****さん wrote...
>テーブルのバックアップ用ボタンを作成したのですが
>
>Private Sub バックアップ_Click()
> If MsgBox("テーブルデータをバックアップしますか?", _
> vbYesNo + vbQuestion) = vbYes Then
> DoCmd.CopyObject "c:\Back\試作.mdb", , acTable, "指示書表紙テーブル"
> ~~~~~~~~ ~~~~~~~~~~~~~~~~~~
> ↑ファイル名 ↑テーブル名
>
> End If
>End Sub
>
>
>サブテーブル「指示内容テーブルサブ」も一緒にCopyさせたいのですが
>テーブル名が1つしか入りません。
>複数のテーブル名を指定するのは無理なのでしょうか?
>
>それから
>指定したフォルダー内にあらかじめコピー先のデータベースを作成しておかないと
>エラーが出てコピーできませんでした。(T◇T)
>フォルダー指定だけではダメですか?
----
勝手な想像、人様の苦労の流れをいつものように想像(創造)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
複数のテーブルをデータごとバックアップしたい。
いろいろと自分なりに調べ、
DoCmd.CopyObject "c:\Back\試作.mdb", , acTable, "指示書表紙テーブル"
で、テーブルがコピーできることを発見する。
ここまでは順調だったが、
空のMDBファイルが無いと、DoCmd.CopyObjectが動作しないことに気がつく。
また、全てのテーブルを一度にコピーするコマンドがあれば聞きたい。
ってことかなぁ。
一生懸命、物語作るのはいいけど、
質問のままの方が、わかり易くない?
気にしないでください、三流解説前の儀式?ですから(笑)
やりたいことは、なんとなく、わかったけど、
さて、どうしましょう。
そんなにスゴイ手じゃないので、期待しないでくださいね。。。
/*
* 2.空のMDBファイルを作成する
*/
もう、DoCmd.CopyObjectでテーブルがコピーできることがわかっているので、
問題は、空のMDBファイルを作ることだけです。
えっと、まずプログラム書く前に、
苦手な参照設定をイタズラします。
モジュールの編集画面のメニューから、
ツールの参照設定を選択します。
↑参考画面
その中から、
MicroSoft ADO Ext 2.5 for DDl〜を選択します
※ADO Ext 2.7など、環境によって違います
~~~~~~~~~~~~~~~~~
↑参考画面
ざっと書いちゃうと、
Private Sub コマンド0_Click()
Dim catTest As New ADOX.Catalog
Dim strConnect As String
Dim strDBNAME As String
strDBNAME = "D:\Backup\試作.mdb" 'バックアップ先のMdb
If MsgBox("テーブルデータをバックアップしますか?", _
vbYesNo + vbQuestion) = vbNo Then
Exit Sub 'NOの時抜ける
End If
If Dir(strDBNAME) <> "" Then 'ファイルが存在したら消す
Kill strDBNAME
End If
'データベースの新規作成
' ADOコネクション文字列の指定
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
' データベースの作成 名前を指定する
catTest.Create strConnect & strDBNAME
' データベースを閉じる
Set catTest = Nothing
'テーブルのコピーテーブル数分書くのが簡単
DoCmd.CopyObject strDBNAME, , acTable, "テーブルA"
DoCmd.CopyObject strDBNAME, , acTable, "テーブルB"
'
MsgBox strDBNAME & "にバックアップしました"
End Sub |
こんな感じです。
参照設定は
Dim catTest As New ADOX.Catalog
を使いたかったからです、実際に使うところは少し待っててもらって、
前準備から説明を開始します。
If MsgBox("テーブルデータをバックアップしますか?", _
vbYesNo + vbQuestion) = vbNo Then
Exit Sub 'NOの時抜ける
End If
普通のYes/NOの確認なんだけど、
私と違って、チャント書いてます。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
えっ、どこが?
vbYesNo + vbQuestionのとこかな。
メッセージボックスには種類があって(音と表示が違って)
vbCritical 警告メッセージ アイコンを表示します。
vbQuestion 問い合わせメッセージ アイコンを表示します。
vbExclamation 注意メッセージ アイコンを表示します。
vbInformation 情報メッセージ アイコンを表示します。
なんてのが、あったんですね。
Sub aaa()
MsgBox "XXXXX", vbYesNo + vbCritical
MsgBox "XXXXX", vbYesNo + vbQuestion
MsgBox "XXXXX", vbYesNo + vbExclamation
MsgBox "XXXXX", vbYesNo + vbInformation
End Sub |
で表示させてみると、違いがよくわかります。
×?▲iって感じのアイコンと音が違います。
些細な違いだけど、丁寧な仕事のシステム、
メッセージの使い分けなどは必要ですよ。
※オマエも読者の丁寧さを少しは見習えよ、、、はい。
話を戻してと、
If Dir(strDBNAME) <> "" Then 'ファイルが存在したら消す
Kill strDBNAME
End If
で、Kill ファイル名でバックアップ先のファイルを消してます。
これから新規に作成する位置にファイルが存在していると、
不具合が起きてしまうので、
Dir関数でファイルの存在をチェック後に削除してます。
次は、消したらすぐに作成する、、、忙しい行動なんだけど
本題のMDBの新規作成です。
'データベースの新規作成
' ADOコネクション文字列の指定
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
' データベースの作成 名前を指定する
catTest.Create strConnect & strDBNAME
' データベースを閉じる
Set catTest = Nothing
で作成します。
後は、配列とか使わないで、力技で簡単に書くと、
'テーブルのコピーテーブル数分書くのが簡単
DoCmd.CopyObject strDBNAME, , acTable, "テーブルA"
DoCmd.CopyObject strDBNAME, , acTable, "テーブルB"
でコピーしてます。
※Allの指定はわからなかったので、続けて書いただけのお馬鹿な書き方。
せめてループで回せよな、、、
/*
* 3.おわりの挨拶
*/
今回は、Access
・空のMDBを作成する方法
・MsgBox警告、インフォなどウインドウの種類を指定してますか?
って話でした。
あっ、タイトルと内容がぜんぜん違うよ
まぁ、いつものことだからゆるしてね。。。(笑)
あっ、単純に、MDBの簡単なバックアップ方法を調べて、
解説すれば、それでよかったのかも。
最適化と組み合わせて、、など、いろいろ用途はありそうなのに。
※どこかから、簡単な技をパクって来たら、またお知らせします。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
<Access レポート Me.NextRecord = Falseで移動を止める>
こんにちは、三流プログラマーKen3です。
今回は、
Access レポートで、
Me.NextRecord = False
を使用して、レコードの移動を止めて見たいと思います。
メルマガの中身はふざけてる言葉が多いけど、
サンプルは真剣に作ったので、
http://www.ken3.org/vba/lzh/vba076.lzh
にtest076.mdb(Access97版)が保存されています。
テストで使ってみてください。
/*
* 1.今回のキッカケ
*/
No.74 Access 列型レポートの左端に印刷したい
http://www.ken3.org/backno/backno_vba15.html#74
で、内容は、
---
> アクセスで列型のレポートを作りたいのですが、困っていることが
> あります。列型のレポートそのものは作れるのですが、ラベルがうまく
> いきません。
> 作りたいのは縦4列のデータを出力し、左端にラベルをつけるとい
> うものです。
> 詳細にラベルを置くと繰り返し出力してしまいます。結局解らなく
> て、現在はラベルと罫線と、データを分けて二重に出力するという面倒
> な方法をとっています。
> 何か解決方法はないものでしょうか?
----
列型のレポート、外枠に何か書きたい、、のかぁ、、
上下はページのヘッダー、フッターがあるけど、
左右はそれらしいの無いしなぁ。今回使いたいのは左側に何か書きたいときかぁ。
で、余白に無理やり書いて、IIfでかわしてみる方法を書いたんだけど、
やはり、印刷部分が長くて、かわせなかったみたい、う〜ん。。。
の続きです。
/*
* 2.アプローチの方法を変える
*/
さてと、余白から攻めてみても、あの子は落とせなかったかぁ。
次のアプローチ方法を考えないとなぁ。
できたら手をかけないで、女の子落としたいよね(目的を達成したいよね)
みんながやってない斬新な方法がいいけど、なかなか思いつかない。
※くだらない恋愛テクニックはネットに転がっているけど、
自分に合うテクニックが無いんだよなぁ。。。じゃなくってVBAテクね。
なんて書いてると、女性読者とマジメ君が解除ボタンを押すので、
路線を戻してと、(あまり戻ってなく、いつもの三流的な文章だけど)
昔のメルマガ印刷系のサンプルで、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Me.NextRecord = False
で、レコードを進ませないで、印刷データの複製を作ったなぁ。
※元ネタは有名な、マイクロソフトサポート技術情報の
最後まで罫線を引くで覚えたMe.NextRecord = Falseだけど。
次の構想、
^^^^^^^^^^
[1111111111] [2222222222] [3333333333] [4444444444]
[5555555555] [6666666666]
と続く印刷を
Me.NextRecord = False を使用して、
[1111111111] [1111111111] [2222222222] [3333333333]
[4444444444] [4444444444] [5555555555] [6666666666]
として、左側の重複データの時、可視のON/OFFでラベル的データを表示する。
そんな戦略で作ってみたいと思います。
※なんだ、昔の女に使った技を応用するのか?
まだ言ってるよ(スミマセン、独り言多くって(笑))
下準備、仕込みで、わかり易くするために
作成したコントロールのcntA(カウンタ)を見えるようにしてと、
(Mod 3) 3で割って余りが1の時はデータを進ませるのを止めるか。
Private Sub 詳細_Format(Cancel As Integer, FormatCount As Integer)
If (Me![cntA] Mod 3) = 1 Then '右端なら
Me.NextRecord = False 'レコードの移動を止める
End If
End Sub |
よし、プレビューするかな。
あっ、画面全体に同じ結果が(笑)レコードが頭から動かないので(笑)
※印刷ボタンを間違って押したら、無限に印刷するので、
テスト時は注意して下さい。
そっか、
レコードが進まないから、カウンタも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処理を入れる
End If
Else
pFLG = False 'その他の時
End If
End Sub |
これで、左端のレコードだけ、2重で印刷することができました。
↑プレビュー結果
おいおい、
2重に印刷してどうするの?
~~~~~~~~~~~~~~~~~~~~~~~~~~
質問は、左端にラベルを印刷したいだろ?
まぁまぁ、あわてないでよ。
次に印刷したいラベルデータと実データの切り替えを行います。
また、=IIF使うんだろ?
それだと、芸が無いし、大変なので、
有名なプロパティ、.Visible = True/Falseを使用します。
まず、ラベルに印刷したい固定文字をレポートに貼ります
lab01,lab02とコントロール名を付けます。
可視は、Falseにしておきます
↑ラベルの配置(中身見て笑わないでね)
印刷する各コントロールに対して、
.Visible = True/Falseを使用して、印刷する/しないを切り替えます。
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 |
ポイントは、
Me.NextRecord = False
でレコードの移動をまず止める。
印刷対象レコードの移動の制御ができたら、次は、
左端の時は、ラベル関係を表示、実データ関係を非表示にしただけです。
~~~~~~~~~~
↑左側にラベルを無事?に表示できました。
/*
* 3.構想の穴(笑)
*/
この作戦でばっちり、女の子を落とせればいいけど
(まだ、言ってるよ、目的を達成できればいいけど)
この構想には、弱点があって、
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[1111111111] [2222222222] [3333333333] [4444444444]
[5555555555] [6666666666]
と続く印刷を
Me.NextRecord = False を使用して、
[1111111111] [1111111111] [2222222222] [3333333333]
[4444444444] [4444444444] [5555555555] [6666666666]
として、左側の重複データの時、可視のON/OFFでラベル的データを表示
もう、気がつきました?
[1111111111] [1111111111] [2222222222] [3333333333]
が
5cm,5cm,5cm,5cm
の等間隔だったら、レコードを進ませない姑息な手段でアプローチも可能だけど、
[lablab] [1111111111] [2222222222] [3333333333]
と
3cm,5cm,5cm,5cm
なんて感じで、ラベルエリアは3cmデータエリアは5cmだと、
この手は使えないんですね。。。。
大丈夫だって、たぶん、女の子、男の子を落とすとき、
本人なりに告白は(VBAは)アレンジして使ってくれるって。
レポートって、普通余白があるから、
[余白2cm] [1111111111] [1111111111] [2222222222] [3333333333]
[余白2cm] [1111111111] [1111111111] [2222222222] [3333333333]
って感じのレポートなら、余白を0.5や0にして
[0.5] [1.5あけてlab3 ] [1111111111] [2222222222] [3333333333]
とか、余白をなくして、
5cm,5cm,5cm,5cm
の左端5の中で、自分でラベルをずらせば(2.0+3.0で5にしたり)なんとかなるかも。
この小細工アプローチで、(いつもの正面から行かない逃げ手で)
女の子、うまく落とせるといいけど。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
あれ?質問者って、男性?女性?どっちだったっけ?
まぁイイヤ、たぶん私のメルマガ女性はあまり読んでないだろうし(笑)
/*
* 4.おわりの挨拶
*/
今回は、Accessのレポートで、
・Me.NextRecord = False を使用してレコードの制御
・.Visible = True/Falseを使用して印刷(表示)の切り替え
って話でした。
メルマガの中身はふざけてる言葉が多いけど、
サンプルは真剣に作ったので、
http://www.ken3.org/vba/lzh/vba076.lzh
にtest076.mdb(Access97版)が保存されています。
テストで使ってみてください。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
<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でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
<Outlookでファイルを添付するには?.Attachments.Add>
こんにちは、三流プログラマーKen3です。
今回は、
VBAでOutlookにファイルを添付するには?
です。
/*
* 1.今回のキッカケ
*/
seltaeb@倉敷さん から
>はじめまして
>検索で「Outlookを操作してメールを送りたい」にたどり着き早速メルマガ登録し
>ました
>
>現在1つのBOOKを業者別に複数のBOOKに分割するところまで作成しております
>次のステップとして業者別のBOOKをMailに添付して自動で送ろうと考えています
>メルマガを参考とさせていただき作成したいと思います
>
>あと、ファイル添付の方法が分からないのでご教示ください
>
>よろしくお願いします
----
ご教示かぁ、、、三流作者にはそんなこと言わなくていいのにね。
なんて書いてないで、調べますか。
/*
* 2.ヘルプの探し方
*/
ヘルプで添付をキーワードに調べると。
.Attachments.Add
ってのが見つかる。(ネットでoutlook 添付で探すと一発だけど)
嘘つくなよテメエ、ExcelVBAのヘルプにそんなの無いぞ。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
素人だと思ってバカにしやがって、いつもヘルプ見ろヘルプ見ろってうるせえ。
Excelのヘルプで添付が出てこないから聞いてんだろ。
まぁまぁ、そんなに興奮しないでよ、どこかの危険な掲示板じゃないんだから。
えっと、これ、Outlookを起動してから、Alt+F11押すと、
OutlookのVBA編集画面が出るんですよ。
ここで、F1(ヘルプ)押して添付とキーワード入力をすると、
Attachmentsオブジェクトを見つけることが出来ます。
※outlook2000,20002からで、97は出ません(残念、、、)
↑ヘルプの検索イメージ
さてと、
Attachmentsオブジェクトのヘルプを見ると、
---
アイテムに添付ファイルを追加するには、Add メソッドを使用します。
一貫した結果を得るには、アイテムの Attachments コレクションのオブジェクトを
追加したり削除したりする前に、アイテムを必ず保存します。
次の VBA の例は、新しいメッセージを作成し、Q496.xls ファイルをリンクではなく
添付ファイルとして添付し、その添付ファイルにわかりやすいキャプションを付けます。
Set myOlApp = CreateObject("Outlook.Application")
Set myItem = myOlApp.CreateItem(olMailItem)
myItem.Save
Set myAttachments = myItem.Attachments
myAttachments.Add "C:\My Documents\Q496.xls", _
olByValue, 1, "1996 年の第 3 四半期報告"
---
なんて載ってます。
/*
* 3. 単体テスト
*/
ヘルプでオブジェクトがわかったので、
.Attachments.Add "ファイル名"でいいのかな。
単体のテストプログラムで確認してみる。
Sub testSEND送信()
Dim oApp As Object 'アプリケーションオブジェクト
Dim objMAIL As Object 'メールのオブジェクト
Dim strMOJI As String '本文
'アプリケーションオブジェクトの作成
Set oApp = CreateObject("Outlook.Application")
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
strMOJI = "こんにちは" & vbCrLf _
& "プログラマーの愚痴、教えまっせ?" & vbCrLf _
& "三流君です。 www.ken3.org よろしく(笑)"
objMAIL.To = "test@ken3.org" '宛先
objMAIL.Subject = "未承諾広告※(笑)" '件名
objMAIL.Body = strMOJI '本文の代入
objMAIL.Attachments.Add "e:\work\test.txt"
objMAIL.Send '直接送信箱行き
End Sub |
実行すると、
あれ?
プログラムが自動的に電子メールを送信しようとしています
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
だってさ。※私のExcel2002とOutlook2002の組み合わせではこんな感じでした。
↑警告画面のイメージ
はい を押すと、無事に送信箱に添付ファイル付のメールが保存されました。
まぁ、
.Attachments.Add "ファイル名"
で、添付はできたかぁ。。。
う〜ん、まぁ、ウイルス問題もあるし、こんな感じなのかなぁ。
警告メッセージみて、ウイルスだとか騒がれるのもイヤなので、
.Send を .Display に変えて、確認してもらってから、
ユーザーに送信ボタンを押してもらう(送信ボタンを押しても、送信トレイに行くだけ)
そんな操作に変えてもらうか、、、
※それだと、連続自動実行ができないじゃん、、、
Sub testSEND送信()
Dim oApp As Object 'アプリケーションオブジェクト
Dim objMAIL As Object 'メールのオブジェクト
Dim strMOJI As String '本文
'アプリケーションオブジェクトの作成
Set oApp = CreateObject("Outlook.Application")
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
strMOJI = "こんにちは" & vbCrLf _
& "プログラマーの愚痴、教えまっせ?" & vbCrLf _
& "三流君です。 www.ken3.org よろしく(笑)"
objMAIL.To = "test@ken3.org" '宛先
objMAIL.Subject = "未承諾広告※(笑)" '件名
objMAIL.Body = strMOJI '本文の代入
objMAIL.Attachments.Add "e:\work\test.txt"
objMAIL.Display '編集メッセージの表示 .Sendから変更
'おまけでOutlook表示
Dim myNameSpace As Object
Dim myFolder As Object
Set myNameSpace = oApp.GetNameSpace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
myFolder.Display '表示
End Sub |
※もう一工夫必要みたいですね。
/*
* 4.おわりの挨拶
*/
今回は、
・添付付のメッセージをOutlookから送る方法
・ウイルス防止なのか?Outlook2002で送信確認のメッセージが出た
って話でした。
解決してないって?バレた(笑)
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
※評価は↓で投票してね。感想は掲示板かメールでくださいね。
もらった、感想メールです。
In message "QA VBA - No.78",
>たっきーさん <xxxx@xxx.xxx> から
>送信確認メッセージが出るというところですが、某書で見た解決法があります。 .display のあとで
>SendKeys "%s", True
>と入れておくと送信までしてくれるようですよ。ただしOultlookがもたもたしていると"%s"が間に合わないので、個人的には
>If Excel.Application.Wait(Now + TimeValue("0:00:10")) Then
> SendKeys "%s", True
>End If
>などとやってお茶を濁しています。異なる環境でうまくいくかどうか分かりませんがお試しください。(私の環境はExcel2000/Outlook2000です。)
----
なるほど、かわしかたがありそうですね。
<SJIS--JISコードの文字列を作成したい>
こんにちは、三流プログラマーKen3です。
今回は、
読者の人から、
Excelのセルに入っている漢字をJISコードの文字列にしたい
と軽い質問を受けました。
/*
* 1.仕様書、書いてますか?
*/
まずは、要求をまとめるんだっけ。
入りのデータは"漢"などの文字列で、
結果を文字列でFFFFなどの16進数で返す。
Function SJIStoJIS(strMOTO as String)
としますか。
なんて、ラフな仕様なんだ・・・
(こんなの仕様書じゃないよ、よくアンタの後輩は作ってたよねこんなんで(爆))
コード変換の仕様を渡さないで、プログラマーに調べながらヤレって?
まぁまぁ、調べながらやりますから、黙っててください。
/*
* 2.初期捜査、初動捜査
*/
よくある話で、がんばって作ったら、標準関数で存在した?って話があります。
少し、Excelのワークシート関数を見てみよう。
おっ、JISって関数ある、これって?
=JIS(A1)
とやると、あっ、半角を全角にするんだぁ。
さらに続けて捜査すると、
=CODE
文字列の先頭文字に対応する ASCII または JIS コードを返します。
戻り値のコード番号は、作業中のコンピュータで使用されている文字セットに
対応しています
これで、JISのコードが返るので、あとは16進数にすれば、
16進数にするのは、
DEC2HEX
10 進数を 16 進数に変換します。
DEC2HEX(数値,桁数)でできるのかぁ。
あれ、使えないよ、、何でだろ?
※あとでわかったのですが、分析ツール?をインストールしてないと、
使えないみたいです。
全てVBAでやろうとしないで、ワークシート関数を探すのも必要ですよ。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/*
* 3.VBAで作成するか
*/
当初の予定通り、VBAで作成します。
10進数を16進数に変換
は
strHex = Hex(Dec)
で変換できます。
が、JISコードの変換関数がVBAに見当たらない、、、オイオイ。
ヘルプでシフトJISをJISに直す関数をチェックすると、
えっ無いの?(探し方が悪いのか?それとも漢字コードなんて気にしないのか?)
ここは、ネットで検索してみるか、
シフトJIS JISコード 変換表
^^^^^^^^^^^^^^^^^^^^^^^^^^
この3つをキーワードにgoogleで検索する
OSF 日本ベンダ協議会 (OSF/JVC) 推奨
日本語 EUC ・シフト JIS 間コード変換仕様とコード系実態調査
http://www.opengroup.or.jp/jvc/cde/sjis-euc.html
日経ソフトウエア JIS漢字コード
http://software.nikkeibp.co.jp/software/special/jiscode/nc.html
なんだか、よくわかんないよ(笑)
オレは変換プログラムを書きたいんだってば、
*自分で変換の意味見て計算式ぐらい書けよ。
と読者の声が聞こえたところで、
初心者によるエンコーディングと文字セットメモ
http://sanaki-web.hp.infoseek.co.jp/code/encode.htm
を見ると、やっと変換の式が書いてある。
---
>S-JIS -> JIS
>if(第一バイト <= 0x9F){
>第一バイト = 第一バイト - 0x71
>}
>else{
>第一バイト = 第一バイト - 0xB1
>}
>第一バイト = 2 * 第一バイト + 1
>if(第ニバイト > 0x7F){
>第ニバイト = 第ニバイト - 1
>}
>if(第ニバイト >= 0x9E){
>第ニバイト = 第ニバイト - 0x7D
>第一バイト = 第一バイト + 1
>}
>else{
>第ニバイト = 第ニバイト - 0x1F
>}
----
を元に作成してみる。
なんかぎこちないコードだけど、下記のように、自作しました。
'シフトJISコードの文字列を受け取り、JISコードを返す
Function SJIStoJIS(strSJISCODE As String) As String
Dim hi As Long
Dim lo As Long
'シフトJISコードの上位バイトを hi、下位バイトを lo とします。
hi = Val("&h" & Mid(strSJISCODE, 1, 2))
lo = Val("&h" & Mid(strSJISCODE, 3, 2))
'hi が 0x9f 以下の場合、 hi から 0x71 減じます。
'そうでない場合、 hi から 0xB1 減じます。
hi = hi - IIf(hi <= &H9F, &H71, &HB1)
'hi に 2 を乗じて、さらに 1 を加えます。
hi = hi * 2 + 1
'lo が 0x7F より大きい場合、 lo から 1 減じます。
If lo > &H7F Then lo = lo - 1
'lo が 0x9E 以上の場合、lo から 0x7D 減じて、hi に 1 加えます。
If lo >= &H9E Then
lo = lo - &H7D
hi = hi + 1
Else 'そうでない場合、 lo から 0x1F 減じます。
lo = lo - &H1F
End If
'結果を返します
SJIStoJIS = Right("0" & Hex(hi), 2) & Right("0" & Hex(lo), 2)
End Function |
使い方は、1文字単位でAsc関数でシフトJISコードを取り出し、
Hexで16進文字列にして渡します。
Sub test()
Dim strMOJI As String
Dim strWORK As String
Dim n As Integer
strMOJI = "仕様書"
strWORK = ""
For n = 1 To Len(strMOJI) '普通は半角のチェックが無いとマズイよね
strWORK = strWORK & SJIStoJIS(Hex(Asc(Mid(strMOJI, n, 1))))
Next n
MsgBox strWORK
Debug.Print strWORK
End Sub |
なんか、変換の嵐でわかりにくいけど、
"仕様書"を変換すると
3B45 4D4D 3D71
となります。
あとは、応用して使ってみてください。
/*
* 4.終わりの挨拶
*/
今回は、
シフトJISコードをJISにする方法でした。
でした。
なんか、標準関数でありそうなんだけどなぁ・・・
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
拾い読みして、
1つでも何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
----------------------------------
有料メルマガ書いてます。こちらもよろしく。
----------------------------------
下記、有料版VB.NETのサンプルです
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
http://www.ken3.org/pmagmag/vbnet/ が登録ページです、登録してね
いろいろとまだ苦戦してます、
有料誌のレベルまで行ってないけど(笑)
^^^^^^^^^^^^^^
※不況の中、余金のあるひとは、笑い話、三流君を笑って優越感に浸る
などの使い道で購読してください、月額390円です。
<.Text.Lengthで文字数 .Text.Chars(n)で一文字取出せます>
(有料版VB.NETのサンプル)
どうも、三流プログラマーのKen3です。
今回も軽めに
・.Text.Lengthで文字数
・.Text.Chars(n)で一文字取出せます
・+=なんて演算も可能
です。
気楽に読んでください。
/*
* 1. 昔のコード
*/
画面仕様
調査文字列 [ _______________ ] txtMOJI
結果 [ ____________________ ] txtOUT
[ ____________________ ] 複数行可能とする
流れ
ユーザーが確認したい文字列を入力後、調査開始のボタンを押します
文字列から1文字単位で文字を取り出し、コードを表示します。
時代遅れな昔のやり方?
Len関数で文字数を求め、
Mid関数で文字列を抜き出し、
Asc関数でコードを表示します
Private Sub btnRUN_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRUN.Click
Dim n As Integer 'カウンタ
Dim strWORK As String '文字保存
Me.txtOUT.Text = "" '結果エリアを初期化
For n = 1 To Len(Me.txtMOJI.Text)
strWORK = Mid(Me.txtMOJI.Text, n, 1)
Me.txtOUT.Text = Me.txtOUT.Text & strWORK & " - " & Asc(strWORK) _
& vbCrLf
Next
End Sub
昔ながらの方法ですね。
ポイントは、
Len関数で文字数を求め、
For n = 1 To Len(Me.txtMOJI.Text)
と1文字目から最終文字までループさせる
strWORK = Mid(Me.txtMOJI.Text, n, 1)とn文字目を取りだし
Me.txtOUT.Text = Me.txtOUT.Text & strWORK & " - " & Asc(strWORK) & vbCrLf
結果 = 結果 に strWORKと取出した文字を&して、
" - " と固定文字を付けて
Asc(strWORK) と文字コードを変換して追加、
最後に改行を追加してます
/*
* 2.VB.NETで書ける書き方(有料版VB.NETのサンプル)
*/
まぁ、動けばどちらでもいいのですが、
Private Sub btnRUN_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRUN.Click
Dim n As Integer 'カウンタ
Dim strWORK As String '文字保存
Me.txtOUT.Text = "" '結果エリアを初期化
For n = 1 To Me.txtMOJI.Text.Length '文字数分ループする
strWORK = Me.txtMOJI.Text.Chars(n - 1) '配列が0からなので
Me.txtOUT.Text += strWORK & " - " & Asc(strWORK) & vbCrLf
Next
End Sub |
と見なれない書き方が出来ます。
ポイントは、
Me.txtMOJI.Text.Length でテキストボックスの文字数がわかります
コントロールが文字数のプロパティを持っているんですね。
で、次のポイントが、
Me.txtMOJI.Text.Chars(n - 1) '配列が0からなので
ここで、何してるかと言うと、
.Text.Chars(0) 1文字目
.Text.Chars(1) 2文字目
.Text.Chars(2) 3文字目
と0からの配列みたいに文字を取出すことができます。
LenとMidを使わないで、コントロールを参照してかけました。
あとは、違和感在るのが、
Me.txtOUT.Text += strWORK & " - " & Asc(strWORK) & vbCrLf
この+=って?な感じですが、
a = a + 1 と累積加算する式を
a += 1 とaに+1すると素直に書くことが出来ます。
Me.txtOUT.Text (+=)に strWORK & " - " & Asc(strWORK) & vbCrLfを足す
そんな感じで短く書けます
strMOJI = strMOJI & "XXXXXX"
strMOJI = strMOJI & "ZZZZZZ"
を
strMOJI += "XXXXXX"
strmoji += "ZZZZZZ"
と書くことが出来ます。
/*
* 3.終わりの挨拶
*/
VB.Net風のやり方?かわかりませんが、
こんな感じで書くことが出来ます。
使えるツール作り、、、までの道のりは長そうです。
気長に待てる人は、購読続けて下さい。
*解説、長くかかりそうなので。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<イベントの共有>(有料版VB.NETのサンプル)
どうも、三流プログラマーのKen3です。
今回は、イベントの共有について書きたいと思います。
/*
* 1. イベントに対してコードを書く(有料版VB.NETのサンプル)
*/
コントロールを貼って、
それに対するイベントを意識してプログラムを書きましょう
と説明してました。
※しつこいよね毎回毎回。
ボタンをクリックしたら〜する
閉じるボタンもボタンが押されたら、
Private Sub btnCLOSE_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnCLOSE.Click
Me.Close() '自分を閉じる
End Sub |
Me.Close
~~~~~~~~
でフォームを閉じる、、
と
ボタンのクリック
~~~~~~~~~~~~~~~~
に対応するイベントを書きました。
/*
* 2.固定概念?を壊してくださいね。(有料版VB.NETのサンプル)
*/
私だけかもしれませんが、
イベントXXXが発生したらZZZZをする。
基本をこんな感じで覚えてました。
私から見ると当然の話で、
ボタンAのクリックイベント、Bのクリックイベントは違うイベントで記述。
そんな私の固定概念があったのですが、
こんな書き方もできます。
ボタンを3つ作ります。
Button1 Button2 Button3 とオブジェクトを作成しました。
通常、ボタン1のクリックイベントを作成すると、下記のような感じです。
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
End Sub |
これに少し細工をして、
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click, _
Button2.Click, Button3.Click
MsgBox(sender.text)
End Sub |
と、Handlesの後ろに、Button2.Click, Button3.Clickを追加します。
で、実行すると、
なんと、ボタン2、3を押した時も、このPrivate Sub Button1_Clickが走る。
そんなに驚くなって?
まぁ、からくりは、
Handlesのイベントハンドラでボタン1〜3のクリックに対してと定義したからです。
私の固定概念は、1イベント1関数だったのですが、
複数のイベントを処理する関数を作成可能なことがわかりました。
まだ慣れてないけど、う〜んVB.NET奥が深そうです。
/*
* 3.終わりの挨拶
*/
VB.Net風のやり方?
私もまだまだなので、コントロールの説明と合わせながら、
昔ながらの流れの説明もして行きたいと思います。
使えるツール作り、、、までの道のりは長そうです。
気長に待てる人は、購読続けて下さい。
*解説、長くかかりそうなので。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
<JISコードの表示ツールを作る>(有料版VB.NETのサンプル)
どうも、三流プログラマーのKen3です。
今回は、
漢字のJISコードの表示ツールを作ってみたいと思います。
今回の画像付きの解説、
http://www.ken3.org/p/e/vbnet013.html
で見れます、
プログラムは、
http://www.ken3.org/p/e/vbnet013.lzh
に圧縮したプロジェクトが入ってます。
あわせて見てください。
/*
* 1. 仕様を決める(有料版VB.NETのサンプル)
*/
画面仕様
調査文字列 [ _______________ ] txtMOJI
結果 [ ____________________ ] txtOUT
[ ____________________ ] 複数行可能とする
流れ
ユーザーが確認したい文字列を入力後、調査開始のボタンを押します
文字列から1文字単位で文字を取り出し、コードを表示します。
オヤ?どこかで見たような?仕様だなぁ。
文字コードの表示で使ってた画面と一緒ですね。
txtMOJIと入力用にテキストボックスを作成して、
結果をtxtOUTに書き込むことにします。
/*
* 2.下準備、調べごと(有料版VB.NETのサンプル)
*/
漢字コード、JISコードの変換関数ないかなぁ、と調べ始める。
Asc関数をヘルプで見ると、返ってくるコードは、
解説
Asc は、入力文字に対するコード ポイント (文字コード) を返します。
2 バイト文字セット (DBCS: Double-Byte Character Set) 値に対しては
-32768 〜 32767 です。
返される値は、TextInfo クラスの ANSICodePage プロパティに含まれている
現在のスレッドのコード ページによって異なります。
TextInfo.ANSICodePage は、
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ANSICodePage
を指定することによって取得できます。
なんかよくわかんないねぇ。
MsgBox(Hex(Asc("愛")))
で実際にテストしてみよう。
FFFF88A4?なにこれ?
( 実行画像)
どうやら、シフトJISみたいですね、頭のFFFFは気になるけど、
88A4がシフトJISです。
とすると、シフトJISをJISに直す関数をチェックすると、
えっ無いの?(探し方が悪いのか?それとも漢字コードなんて気にしないのか?)
シフトJIS JISコード 変換表
をキーワードにgoogleを検索する
OSF 日本ベンダ協議会 (OSF/JVC) 推奨
日本語 EUC ・シフト JIS 間コード変換仕様とコード系実態調査
http://www.opengroup.or.jp/jvc/cde/sjis-euc.html
日経ソフトウエア JIS漢字コード
http://software.nikkeibp.co.jp/software/special/jiscode/nc.html
なんだか、よくわかんないよ(笑)
オレは変換プログラムを書きたいんだってば、
*自分で変換の意味見て計算式ぐらい書けよ。
と読者の声が聞こえたところで、
初心者によるエンコーディングと文字セットメモ
http://sanaki-web.hp.infoseek.co.jp/code/encode.htm
を見ると、やっと変換の式が書いてある。
>S-JIS -> JIS
>if(第一バイト <= 0x9F){
>第一バイト = 第一バイト - 0x71
>}
>else{
>第一バイト = 第一バイト - 0xB1
>}
>第一バイト = 2 * 第一バイト + 1
>if(第ニバイト > 0x7F){
>第ニバイト = 第ニバイト - 1
>}
>if(第ニバイト >= 0x9E){
>第ニバイト = 第ニバイト - 0x7D
>第一バイト = 第一バイト + 1
>}
>else{
>第ニバイト = 第ニバイト - 0x1F
>}
を元に作成してみる。
'シフトJISコードの文字列を受け取り、JISコードを返す
Function SJIStoJIS(strSJISCODE As String) As String
Dim hi As Long
Dim lo As Long
'シフトJISコードの上位バイトを hi、下位バイトを lo とします。
hi = Val("&h" & Mid(strSJISCODE, 1, 2))
lo = Val("&h" & Mid(strSJISCODE, 3, 2))
'hi が 0x9f 以下の場合、 hi から 0x71 減じます。
'そうでない場合、 hi から 0xB1 減じます。
hi = hi - IIf(hi <= &H9F, &H71, &HB1)
'hi に 2 を乗じて、さらに 1 を加えます。
hi = hi * 2 + 1
'lo が 0x7F より大きい場合、 lo から 1 減じます。
If lo > &H7F Then lo = lo - 1
'lo が 0x9E 以上の場合、lo から 0x7D 減じて、hi に 1 加えます。
If lo >= &H9E Then
lo = lo - &H7D
hi = hi + 1
Else 'そうでない場合、 lo から 0x1F 減じます。
lo = lo - &H1F
End If
'結果を返します
SJIStoJIS = Right("0" & Hex(hi), 2) & Right("0" & Hex(lo), 2)
End Function |
あれ、Right関数にエラーのときの波線が入っているよ。
( エラー画像)
なんで?Right関数って無いの?と思い、ヘルプを見ると、
解説
Str の文字数を確認するには、Len 関数を使用します。
Windows フォーム、
または Right プロパティを持つほかの任意のクラスで使用される場合、
Microsoft.VisualBasic.Right で関数を完全修飾する必要があります。
^^^^^^^^^^^^^^^^^^^^^^^^^^^
えっ、そんなこと必要なの、、、
なんか、イヤだなぁ、、、
Private Sub btnRUN_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnRUN.Click
Dim n As Integer 'カウンタ
Dim strWORK As String '文字保存
Dim strCODE As String '文字コード16進
Me.txtOUT.Text = "" '結果エリアを初期化
For n = 1 To Me.txtMOJI.Text.Length '文字数分ループする
strWORK = Me.txtMOJI.Text.Chars(n - 1) '配列が0からなので
Me.txtOUT.Text += ("[" & strWORK & "] - ")
strCODE = Microsoft.VisualBasic.Right(Hex(Asc(strWORK)), 4)
If Len(strCODE) <= 2 Then '1バイト半角文字なら
Me.txtOUT.Text += ("ASCII " & strCODE & "半角です")
Else
Me.txtOUT.Text += ("SJIS=" & strCODE)
Me.txtOUT.Text += (" JIS=" & SJIStoJIS(strCODE))
End If
Me.txtOUT.Text += vbCrLf '改行
Next
End Sub
と、してなんとか作ってみました。
こんなに一生懸命やらなくても、何かいいほうほうがありそうだけど。
/*
* 3.終わりの挨拶(有料版VB.NETのサンプル)
*/
VB.Net風のやり方?
よくわからなくて、すみません。
Microsoft.VisualBasic.Right(Hex(Asc(strWORK)), 4)
これは、なんかガセネタって感じがするけど。。。
"Vb 仕様書"を変換すると、
[V] - ASCII 56半角です
[b] - ASCII 62半角です
[ ] - ASCII 20半角です
[仕] - SJIS=8E64 JIS=3B45
[様] - SJIS=976C JIS=4D4D
[書] - SJIS=8F91 JIS=3D71
と無事変換されました。
使えるツール作り、、、までの道のりは長そうです。
ループ処理や文字列操作の参考になれば幸いです。
気長に待てる人は、購読続けて下さい。
*解説、長くかかりそうなので。
プログラム作りは簡単で面白いなぁと感じるような
解説/メールマガジンを書きたいと思ってます。
よろしくお願いします。
AB型の変わり者、三流プログラマーのKen3でした。
検索して目的の情報を探す。
目的の情報を探すには、最近はググれとよく聞きます。なので、検索ボックスを付けました。
いろいろなキーワードを入れて、検索してみてください。
ページフッター
ここまで、読んでいただきどうもです。ここから下は、三流君宛のメッセージ送信や 三流君のホームページの紹介・案内です
目的の情報が見つかったか?少々心配しつつ、、、※質問や感想は、気軽に送ってくださいね。
質問や要望など メッセージを送る(三流君に連絡する)
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
|
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
|
急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。
リンクや広告など
項目別に↓に人気の記事をまとめてみました。お探しのジャンルを選択してください。
人気記事(来場者が多いTOP3):
[VBAでIE,WebBrowserを操作]・・・VBAでIE,WebBrowserを操作する サンプルです
[Access から Excel 連携 CreateObject("Excel.Application")]・・・AccessからExcelを操作したりデータの書き出しなどです
[VBAでOutlookの操作 CreateObject("Outlook.Application" )]・・・VBAからOutlookを使い、メール関係を処理するサンプルです
↑上記3つみたいなCreateObjectで他のアプリケーションを操作するサンプルが人気です。
開発時の操作:
[F1を押してHELPを見る]/
[Debug.Print と イミディエイトウインドウ]/
[実行時エラーでデバッグ]/
[ウォッチ式とSTOP]/
[参照設定を行う]
仕様書(設計書?) XXXX書類:
[基本設計書や要求仕様書]/
[テスト仕様書 テストデータ]/
[バグ票]/
[関数仕様書]/
[流れは 入力・処理・出力]
Excel関係:
[Excel UserFormを操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
[ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
[Excel関係 関数、その他]・・・その他Excel関係です
Access関係:
[Access UserForm/サブフォーム 操作]・・・アクセスでフォームを使ったサンプルです
[Access レポート操作]・・・レポートを操作してみました
[Access クエリーやその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
その他:VBAの共通関数やテキストファイルの操作など
[VBAでテキストファイル(TextFile)の操作]・・・普通のテキストファイルを使ったサンプルです
[VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
Blog:[三流君の作業日記]/
[サンプルコードのゴミ箱]/
広告-[通販人気商品の足跡]
[三流君(TOP ken3.org へ戻る)]
/ [VBA系TOPへ]
/ [VBA系バックナンバー目次へ移動]