もう、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
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
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
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
で切り替える、そんな小細工もプログラマー的には、アリですよ。
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
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
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
画面仕様
調査文字列 [ _______________ ] 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
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
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
と、してなんとか作ってみました。
こんなに一生懸命やらなくても、何かいいほうほうがありそうだけど。