'-------------------------------------------------------------------- ' 定義セクション '-------------------------------------------------------------------- Private Type FLTIMAGE StructSize As Integer Type As Byte Reserved1(0 To 8) As Byte hImage As Long Reserved3(0 To 19) As Byte End Type Private Type FLTFILE Reserved1 As Integer Ext As String * 4 Reserved2 As Integer Path As String * 260 Reserved3 As Currency End Type Private Declare Function GetFilterInfo Lib _ "C:\Program Files\Common Files\Microsoft Shared\Grphflt\JPEGIM32.FLT" _ (ByVal Ver As Integer, ByVal Reserved As Long, _ phMem As Long, ByVal flags As Long) As Long Private Declare Function ExportGr Lib "JPEGIM32.FLT" _ (ff As FLTFILE, fi As FLTIMAGE, ByVal hMem As Long) As Long Private Declare Function OpenClipboard Lib "user32" _ (ByVal hWndNewOwner As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function GetClipboardData Lib "user32" _ (ByVal uFormat As Long) As Long Const CF_ENHMETAFILE = 14 Private Declare Function CopyEnhMetaFile Lib "gdi32" _ Alias "CopyEnhMetaFileA" _ (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long Private Declare Function DeleteEnhMetaFile Lib "gdi32" _ (ByVal hemf As Long) As Long Private Declare Function GlobalFree Lib "kernel32" _ (ByVal hMem As Long) As Long '-------------------------------------------------------------------- ' 関数名 : SaveClipToJpg ' 機能 : 指定図形をJPGファイルとして保存する ' 引数 : img : シェイプオブジェクト[I] ' path :格納先パス(ファイル名も含む) ' 戻り値 : 成否 ' 作成日 : 2008/03/08 ' 作成者 : lily(http://vbatips.blog37.fc2.com/) '-------------------------------------------------------------- Function SaveClipToJpg(img As Shape, Path As String) As Boolean Dim tFltImg As FLTIMAGE Dim tFltFile As FLTFILE Dim hemf As Long Dim hMem As Long SaveClipToJpg = False 'クリップボードにコピー img.CopyPicture 'Selection.CopyPicture If OpenClipboard(0) Then hemf = CopyEnhMetaFile( _ GetClipboardData(CF_ENHMETAFILE), _ vbNullString) CloseClipboard End If If hemf = 0 Then Exit Function ' パラメータ設定 tFltFile.Path = Path & vbNullChar With tFltImg .StructSize = LenB(tFltImg) .Type = 1 .hImage = hemf End With ' フィルタ呼び出し If GetFilterInfo(3, 0, hMem, &H10000) And &H10 Then If ExportGr(tFltFile, tFltImg, hMem) = 0 Then SaveClipToJpg = True End If End If If hMem Then GlobalFree hMem DeleteEnhMetaFile hemf End Function '-------------------------------------------------------------------- ' 関数名 : CheckZenkaku ' 機能 : 対象文字列に全角文字が含まれているかどうかチェックします ' 引数 : str :対象文字列[I] ' 戻り値 : True :全角文字混在 False:全て半角文字 ' 作成日 : 2008/03/09 ' 作成者 : lily(http://vbatips.blog37.fc2.com/) '--------------------------------------------------------------------- Function CheckZenkaku(ByVal str As String) As Boolean Dim strAnsi As String strAnsi = StrConv(str, vbFromUnicode) If Len(str) = LenB(strAnsi) Then CheckZenkaku = False Else CheckZenkaku = True End If End Function '-------------------------------------------------------------------- ' 関数名 : JpgUploader_Main ' 機能 : VBAのオートシェイプを保存しブログへ画像をアップロードする ' 引数 : なし ' 戻り値 : なし ' 作成日 : 2008/03/09 ' 作成者 : lily(http://vbatips.blog37.fc2.com/) '-------------------------------------------------------------------- Sub JpgUploader_Main() Dim bSaveFlg As Boolean Dim sShapeName As String Dim sFileName As String Dim sSavePath As String Dim sXmlRpcUrl As String Dim sLoginUser As String Dim sLoginPass As String Dim sBase64Flg As String Dim sClassPath As String Dim sCmdStr As String '**************************************************************************************** '* ユーザ設定箇所 Start sClassPath = "E:/test/mdl/" 'mdlフォルダ格納パス(最後スラッシュで終わること) sSavePath = "E:/test/Jpg/" 'JPG保存先パス(最後スラッシュで終わること) sXmlRpcUrl = "http://blog.fc2.com/xmlrpc.php" 'FC2ブログXml-RpcのURL '※ブログサービス毎に異なる sLoginUser = "××××××" 'ブログにログインする為のユーザ名 sLoginPass = "××××" 'ブログにログインする為のパスワード '画像のアップロードを行う際、画像のバイナリデータをBase64にエンコードするという仕様が 'ありますが、FC2ブログの場合はエンコードしなくても良いので0を設定します。他のブログサービスで 'エンコードが必要かどうかは?試してません。ただ、Movable Typeに関してはエンコードの必要が 'あります。 ' エンコード有り:1 例)Movable Type ' エンコード無し:0 例)FC2ブログ sBase64Flg = "0" '* ユーザ設定箇所 End '**************************************************************************************** 'オートシェイプの名前取得 sShapeName = Selection.Name Do 'ファイル名入力画面表示 sFileName = InputBox("ファイル名を入力してください。(拡張子無し)") If CheckZenkaku(sFileName) = True Then MsgBox "ファイル名は半角文字のみで入力してください" Else Exit Do End If Loop If sFileName = "" Then sFileName = sShapeName & ".jpg" sFileName = Replace(sFileName, " ", "") Else sFileName = sFileName & ".jpg" End If sSavePath = sSavePath & sFileName 'オートシェイプ保存 bSaveFlg = SaveClipToJpg(ActiveSheet.shapes(sShapeName), sSavePath) If bSaveFlg = True Then 'MsgBox "保存に成功しました" Else MsgBox "保存に失敗しました" Exit Sub End If 'コマンド作成 sCmdStr = "cmd.exe /k java -cp " sCmdStr = sCmdStr & sClassPath & ".;" sCmdStr = sCmdStr & sClassPath & "commons-codec-1.3.jar;" sCmdStr = sCmdStr & sClassPath & "xmlrpc-2.0.jar;" sCmdStr = sCmdStr & " " & "BlogFileUpLoader" sCmdStr = sCmdStr & " " & sSavePath sCmdStr = sCmdStr & " " & sXmlRpcUrl sCmdStr = sCmdStr & " " & sLoginUser sCmdStr = sCmdStr & " " & sLoginPass sCmdStr = sCmdStr & " " & sBase64Flg Debug.Print sCmdStr 'アップロード実行 Call Shell(sCmdStr, vbNormalFocus) End Subこれで、Excel上で作成したオートシェイプはボタン一つで、ブログへアップロードできるという画期的な仕組みが実現できたワケです。でも、これ作成するまで、結構時間かかりました・・・。
Author:lily
作業を楽にする為の苦労を惜しみません。![]()