Sub aaa()
Dim myOlApp As Outlook.Application
Dim myitem As MailItem
Set myOlApp = CreateObject("Outlook.Application")
Set myitem = myOlApp.CreateItem(olMailItem)
myitem.To = "test@ken3.org"
myitem.Body = "test"
myitem.Importance = olImportanceHigh
myitem.Display
End Sub
Sub test送信メール作成()
Dim oApp As Object 'アプリケーションオブジェクト
Dim objMAIL As Object 'メールのオブジェクト
Dim strMOJI As String '本文
'アプリケーションオブジェクトの作成
Set oApp = CreateObject("Outlook.Application")
Set objMAIL = oApp.CreateItem(0) 'olMailItem=0
'メールアイテム作成後、重要度を高olImportanceHigh=2にする
objMAIL.Importance = 2 'olImportanceHigh=2
strMOJI = "こんにちは" & vbCrLf _
& "プログラマーの愚痴、教えまっせ?" & vbCrLf _
& "http://www.ken3.org/ よろしく(笑)"
objMAIL.To = "test@ken3.org" '宛先
objMAIL.Subject = "未承諾広告※(笑)" '件名
objMAIL.Body = strMOJI '本文の代入
objMAIL.Display '途中で編集したい時(メール表示してみた)
'おまけでOutlook表示
Dim myNameSpace As Object
Dim myFolder As Object
Set myNameSpace = oApp.GetNameSpace("MAPI")
Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダーを指定
myFolder.Display '表示
End Sub
Sub Main()
'Application.InputBoxでセルを選択させる
Dim objTARGET As Range '選択されたセルの集合
Set objTARGET = Application.InputBox(prompt:="セルを選択", Type:=8)
If IsEmpty(objTARGET) Then 'キャンセルが押されたかチェックする
MsgBox "キャンセルが押されました"
Exit Sub
End If
'ファイル名を作成 ファイル名は自分のパス+\test.html
Dim strFNAME As String 'ファイル名保存用
strFNAME = ThisWorkbook.Path & "\test.csv" 'ファイル名を作る
'テーブルデータを作成する
Call MAKE_CSV_FILE(strFNAME, objTARGET)
'できたファイルをメモ帳で表示して確認する
Shell "notepad.exe " & strFNAME '手抜きでShellで起動
'終わりの挨拶
MsgBox strFNAME & "を作成しました"
End Sub
'ファイル名とセルの範囲RANGEを受け取り、
'ファイルを開きカンマ区切りのファイルを作成する
Sub MAKE_CSV_FILE(strFNAME As String, objHANI As Range)
'ファイルをオープンする
Dim FNO As Integer 'ファイル番号
FNO = FreeFile '空いてるファイル番号を取出す
Open strFNAME For Output As #FNO 'テキストファイルを新規作成
'行、列でループを作る
Dim y As Integer
Dim x As Integer
For y = 1 To objHANI.Rows.Count '行のループ
For x = 1 To objHANI.Columns.Count '列のループ
Print #FNO, objHANI.Cells(y, x).Value;
Print #FNO, ",";
Next x
Print #FNO, "" '改行のみ出力
Next y
'ファイルをクローズする
Close #FNO
End Sub
ファイルを開いて、何も考えないで出力してみました。
ポイントは、
~~~~~~~~~~~~
For y = 1 To objHANI.Rows.Count '行のループ
For x = 1 To objHANI.Columns.Count '列のループ
Print #FNO, objHANI.Cells(y, x).Value;
Print #FNO, ",";
Next x
Print #FNO, "" '改行のみ出力
Next y
で、セルの範囲をループさせて、
.Valueをそのまま出力してます。
/*
* 2.実行テスト
*/
プログラムが完成したら、テスト、不具合修正、またテスト・・
といった作業になるのかなぁ。
データを用意して、テストしてみました。
日付 単価 数量 合計金額 備考
2003/6/7 22:34 10 5 50.0 文字列は、、、
2003年6月7日 12.5 5 62.5 文字列は、、、
平成15年6月7日 25.5 1.15 29.3 文字列は、、、
H15.6.7 750 1.3 975.0 文字列は、、、
合計は表示形式で小数点以下1位まで。
日付は=Now()関数と表示形式を変えてます。
上記の表を変換してみました。
すると、変換結果は、
日付,単価,数量,合計金額,備考,
2003/06/07 22:34:14 , 10 , 5 , 50 ,文字列は、、、,
2003/06/07 22:34:14 , 12.5 , 5 , 62.5 ,文字列は、、、,
2003/06/07 22:34:14 , 25.5 , 1.15 , 29.325 ,文字列は、、、,
2003/06/07 22:34:14 , 750 , 1.3 , 975 ,文字列は、、、,
でした。
う〜ん、一工夫必要ですね。
^^^^^^^^^^^^^^^^^^^^^^^^^^
まず、気になるのは、実害は無いかもしれないが、
カンマが1つ多く出力されている(行最後のカンマ)
日付,単価,数量,合計金額,備考,←の最後の改行前のカンマ
これは、
For x = 1 To objHANI.Columns.Count '列のループ
Print #FNO, objHANI.Cells(y, x).Value;
Print #FNO, ",";
Next x
データ出力 Print #FNO, objHANI.Cells(y, x).Value;
カンマを出力 Print #FNO, ",";
とペアで出力しているからです。
これを、値の前にカンマを出力すように変更してみます。
For x = 1 To objHANI.Columns.Count '列のループ
Print #FNO, ",";
Print #FNO, objHANI.Cells(y, x).Value;
Next x
これだけだと、今度は、先頭にカンマが付く(笑)
,日付,単価,数量,合計金額,備考
カンマを出力してからデータを書いてるので、あたりまえか。。。
なので、もう一工夫、
For y = 1 To objHANI.Rows.Count '行のループ
Print #FNO, objHANI.Cells(y, 1).Value; '先頭項目の出力
For x = 2 To objHANI.Columns.Count '列のループ
Print #FNO, ",";
Print #FNO, objHANI.Cells(y, x).Value;
Next x
Print #FNO, "" '改行のみ出力
Next y
と、先頭項目を出力後、カウンタを2からスタート、
カンマを出力後、データを出してみました。
※小細工だけどね。
'ファイル名とセルの範囲RANGEを受け取り、
'ファイルを開きカンマ区切りのファイルを作成する
Sub MAKE_CSV_FILE(strFNAME As String, objHANI As Range)
'ファイルをオープンする
Dim FNO As Integer 'ファイル番号
FNO = FreeFile '空いてるファイル番号を取出す
Open strFNAME For Output As #FNO 'テキストファイルを新規作成
'行、列でループを作る
Dim y As Integer
Dim x As Integer
For y = 1 To objHANI.Rows.Count '行のループ
Print #FNO, objHANI.Cells(y, 1).Value; '先頭項目の出力
For x = 2 To objHANI.Columns.Count '列のループ
Print #FNO, ",";
Print #FNO, objHANI.Cells(y, x).Value;
Next x
Print #FNO, "" '改行のみ出力
Next y
'ファイルをクローズする
Close #FNO
End Sub
Sub READ_DATA_TEST()
Dim nFILENO As Integer 'ファイル番号
Dim strInFileName As String '入力ファイル名
Dim strBUFF As String 'レコードを読みこむバッファ
Dim n As Integer 'カウンター変数
strInFileName = "e:\work\0001.dat" 'ファイル名を作る今は固定値だけど
'ファイルの存在チェック
If Dir(strInFileName) = "" Then
MsgBox strInFileName & "が見つかりません"
Exit Sub
End If
'ファイルを入力モードで開く
nFILENO = FreeFile() '空いているフィル番号を取り出す
Open strInFileName For Input As #nFILENO 'ファイルを入力モードで開く
'空読みする(行を読み飛ばす)
For n = 1 To 4 'テストで4行読み飛ばす
Line Input #nFILENO, strBUFF '読み込むが何もしない
Next n
'数行読み込む
For n = 1 To 3 'テストで3行読み込む
Line Input #nFILENO, strBUFF 'バッファに読み込む
MsgBox "読み込んだデータ" & strBUFF
Next n
'ファイルは閉じようね
Close #nFILENO
End Sub
Sub READ_DATA(strInFileName As String, _
nSTART As Integer, _
nREADCNT As Integer, _
strREADBUFF() As String)
Dim strBUFF As String 'データ読み込み用のバッファ
Dim nFILENO As Integer 'ファイル番号
Dim n As Integer 'カウンター変数
Dim nSETCNT As Integer
'ファイルを入力モードで開く
nFILENO = FreeFile() '空いているフィル番号を取り出す
Open strInFileName For Input As #nFILENO 'ファイルを入力モードで開く
'空読みする(行を読み飛ばす)
For n = 1 To nSTART - 1 '開始行数の1つ前まで空読みする
If EOF(nFILENO) = True Then Exit For '途中でファイルが終わっていたか?
Line Input #nFILENO, strBUFF '読み込むが何もしない
Next n
'数行分読み込み、バッファにセットする
nSETCNT = 0
For n = 1 To nREADCNT '読み込み行数分ループで読み込む
If EOF(nFILENO) = True Then Exit For '途中でファイルが終わっていたか?
Line Input #nFILENO, strBUFF 'バッファに読み込む
strREADBUFF(nSETCNT) = strBUFF 'データをn番目にセット
nSETCNT = nSETCNT + 1 'セット位置を+1する
Next n
'ファイルは閉じようね
Close #nFILENO
End Sub
Private Sub コマンド8_Click()
Dim rs As Recordset 'フォームのレコードセットのクローンをもらう
Set rs = Me.RecordsetClone 'レコードセットのクローンを代入
MsgBox rs.RecordCount
End Sub
Dim rs As Recordsetとレコードセットの変数を定義して、
Set rs = Me.RecordsetClone
で複製を代入。
あとは、普通のレコードセット同様に使用可能です。
MsgBox rs.RecordCount
とテストでは、レコード数を表示しましたたが。
※ある意味、フォームデータのソートやフィルターとかも効くし
便利です。
これができるなら、Me.Recordsetってあってもいいと思うのに、
Access97では、出てこなかった。
※いまファミレスやフォースとフードで流行っている
裏メニューって感じで裏プロパティがあるのかなぁ・・う〜ん。
クローンで複製作れるなら、そのままセットできてもと思うが、
Access97は、Me.RecordSourceで切り替えみたいです。
Access2000でDAO関係を使用するには、DAOの参照設定を行い。
Dim rs As DAO.Recordset
とDAO.のレコードセットですよと変数宣言で書く。
Private Sub コマンド40_Click()
'Access2000の場合、DAOの参照設定を入れて使用する
Dim rs As DAO.Recordset 'フォームのレコードセットのクローンをもらう
Set rs = Me.RecordsetClone 'レコードセットのクローンを代入
MsgBox rs.RecordCount
End Sub
Private Sub コマンド9_Click()
On Error GoTo Err_コマンド9_Click
Dim oApp As Object
Dim y As Integer
Set oApp = CreateObject("Excel.Application")
oApp.Visible = True
'Only XL 97 supports UserControl Property
oApp.UserControl = True
'ブックを作成
oApp.Workbooks.Add '新規ワークブックの追加
'フォームのレコードセットを代入する
Dim rs As Recordset 'フォームのレコードセットのクローンをもらう
Set rs = Me.RecordsetClone 'レコードセットのクローンを代入
rs.MoveFirst '先頭行へ移動
y = 1
While rs.EOF = False
'フィールドを転記
oApp.Cells(y, "A") = rs![ID]
oApp.Cells(y, "B") = rs![F_TITLE]
oApp.Cells(y, "C") = rs![F_MEMO]
'次のレコードへ移動
rs.MoveNext 'レコードセット移動
y = y + 1 'セット位置を移動
Wend
'クローンを破棄する
Set rs = Nothing
Exit_コマンド9_Click:
Exit Sub
Err_コマンド9_Click:
MsgBox Err.Description
Resume Exit_コマンド9_Click
End Sub
ポイントは、
^^^^^^^^^^^^
Dim rs As Recordset 'フォームのレコードセットのクローンをもらう
Set rs = Me.RecordsetClone 'レコードセットのクローンを代入
で、
フォーム.レコードセット複製を受け取り、
Set oApp = CreateObject("Excel.Application")
で作成したExcelに対して、
下記のように、レコードの先頭から終わりまで、データを転記してます。
rs.MoveFirst '先頭行へ移動
y = 1
While rs.EOF = False
'フィールドを転記
oApp.Cells(y, "A") = rs![ID]
oApp.Cells(y, "B") = rs![F_TITLE]
oApp.Cells(y, "C") = rs![F_MEMO]
'次のレコードへ移動
rs.MoveNext 'レコードセット移動
y = y + 1 'セット位置を移動
Wend
この処理で、重たいクエリーが2回まわらなければいいけど。
余談ですが、
Set rs = Me.RecordsetClone
で面白いなぁと感じたのは、
フォームのメニューでフィルターとか並べ替えとか、
ユーザーさんが操作する、
その状態でレコードセットの複製が作成されるみたいなので
フォームの順番どおりにExcelにデータを転記することが出来ました。
別の処理で、フォームからExcelデータ作成時、使えるかなぁとフト思いました。
-【けんぞう!】---------------------------------------------------------
月500円、タバコなら2箱、120円缶コーヒーなら4缶分の謝礼をGetするなら
http://www.ken3.org/etc/500yen/ ←無料アンケート系の広告です。
『チッ、がんばって回答して月500円かよ』(お馬鹿なプログラマー:30歳)
------------------------------------------------------------------------