CorelDRAWでマクロを利用するためのドキュメント「Creating VBA Macros with User Interface in CorelDRAW and Corel DESIGNER」の和訳です。
CorelDRAWでマクロを利用するためのドキュメント「Creating VBA Macros with User Interface in CorelDRAW and Corel DESIGNER」の和訳です。
このチュートリアルでは、開発環境のVisual Basic for Applications(VBA)を使用して、CorelDRAW Graphics Suite(CDGS)X7とCorelDRAW Technical Suite(CDTS)X7のために、どのように、マクロを作成するかをデモンストレーションします。これは、CorelDRAW、Corel DESIGNERやCorel PHOTO-PAINTのような、どのCDGS / CDTSアプリケーションでも実行できます。
この記事では、指定されたフォルダから画像を取得し、Corel PHOTO-PAINTで、それらを開き、特定の寸法にそれらの大きさを変更し、さまざまなフォルダに、それらを保存する、単純な画像の大きさを変更するマクロを作成する手順について説明します。以下で説明する例は、Corel PHOTO-PAINT X7のために設計されていますが、同じ原則をCorelDRAWとCorel DESIGNERに簡単に適用できます。
マクロ・プロジェクトには、ダイアログ・ボックスを表示する単純なマクロが含まれています。これにより、ユーザーは、処理する画像の場所を入力できます。必要な寸法と出力フォルダ。
新しいマクロ・プロジェクトを作成する
Creating New Macro Project
まず、Image Resizerマクロのために、新しいマクロ・プロジェクトを作成します。このため、マクロ・マネージャー・ドッキング・ウィンドウ(Alt-Shift-F11)を開きます。リストから"Visual Basic for Applications"を選択し、右クリックして"New Macro Project…"を選択します。
"Save As"ダイアログ・ボックスが、表示されるとき、ファイル名に"ImageResizer"と入力します。これにより、ImageResizer.gmsという新しいマクロ・プロジェクトが作成されます。そして、それは、すぐに、マクロ・マネージャー・ドッキング・ウィンドウに読み込みます。:
"ImageResizer"を右クリックします。そして、"New Module"をポップアップ・メニューから選択します。そして、作成されたモジュールの名前を"Resizer"に変更します。
最後に、"Resizer"モードを右クリックし、"New Macro"を選択します。それは、新しい"Macro1"を開いた状態で、VBAエディタを開きます。:
マクロ・コードを次のように編集することで、マクロの名前を変更し、単純なメッセージを示します。:
Sub Start()
MsgBox "Hello, world!"
End Sub
次に、基本的なマクロ・プロジェクトが設定されます。Macro Manager DockerのImageResizer > Resizerの下にある"Start"マクロをダブルクリックすることで、あなたは、このマクロを実行してみることができます。:
マクロ・ダイアログ・ボックスを作成する
Creating Macro Dialog Box
マクロ・プロジェクトが、設定されたので、ユーザー・インターフェイスを追加する時です。VBAエディターに切り替えます。VBAのプロジェクト・エクスプローラ・ドッキング・ウィンドウ(Ctrl-R)で、Resizerモジュールを選択し、それを右クリックし、ポップアップ・メニューから、Insert > UserFormを選択します。:
新しいユーザー・フォームが、マクロ・プロジェクトに追加され、フォーム・デザイナー・ウィンドウが、開きます。:
VBAのプロパティ・ドッキング・ウィンドウが、ユーザー・フォームのために、いろいろなカスタマイズ・オプションを表示することに注意してください。たとえば、Captionプロパティは、フォームのタイトルバーに表示されるテキストを指定します。デフォルトの"UserForm1"文字列を"Image Resizer"に置き換えます。
次に、"Resizer"マクロ・モジュール・エディタに切り替えます。(VBAプロジェクト・エクスプローラの"Modules"下の"Resizer"上で、ダブルクリックする)。そして、マクロを変更して、"Hello, world"メッセージボックスの代わりに、新しいダイアログボックスを表示しますが、読むために、コードを編集します:
Sub Start()
UserForm1.Show
End Sub
次に、あなたは、マクロを実行して、新しいダイアログ・ボックスの外観を確認できます。Corel PHOTO-PAINTのMacro Manager Dockerから実行します。あるいは、Startサブルーチン・コード内のどこかにテキスト・カーソルを配置して、あなたは、直接、VBAエディタから、これを行うことができます。そして、F5キーを押して実行します。:
これで、ダイアログボックスをImage Resizerマクロで表示できるようになりました。コントロールを追加する時がです。VBAフォーム・エディタのToolboxには、現在利用できるすべてのユーザー・コントロールが含まれています。:
ツールボックスには、次のコントロールが含まれています。テキストラベル、テキストボックス、コンボボックス、リストボックス、チェックボックス、ラジオボタン、トグルボタン、グループボックス、コマンドボタン、タブストリップ、マルチページコントロール、スクロールバー、スピンボタン、画像。サードパーティのコントロール・ライブラリから、より多くのコントロールをツール・ボックスに追加できます。
次のスクリーンショットに示すように、ラベルコントロール、テキストボックス、コマンドボタン、およびチェックボックスを配置します。:
コントロールを選択すると、あなたは、マクロ・コードで、コントロールを識別するために、それによりわかりやすい名前を付けることができます。なぜなら、自動で、TextBox1とLabel2のような、生成したコントロールの名前は、あまり、説明的ではありません。コントロールの名前は、Propertiesドッキング・ウィンドウで、"(Name)"プロパティで指定できます。
次のコントロールは、フォームで使用されます。型と名前を含めます(左から右、上から下):
Caption/Text | Control Type | Name |
---|---|---|
Source Folder: | Label | lblSourceFolder |
TextBox | txtSourceFolder | |
Browse… | CommandButton | cmdBrowseSource |
Destination Folder: | Label | lblDestFolder |
TextBox | txtDestFolder | |
Browse… | CommandButton | cmdBrowseDest |
Width: | Label | lblWidth |
100 | TextBox | txtWidth |
px | Label | lblWidthUnit |
Height: | Label | lblHeight |
100 | TextBox | xtHeight |
px | Label | lblHeightUnit |
Maintain proportions | CheckBox | cbMaintainProportions |
Resize Images | CommandButton | cmdResize |
すべてのコントロールが、フォームに適切に配置されたので、Corel PHOTO-PAINTのMacro Manager Dockerから実行したとき、マクロをもう一度実行して、実際のフォームが、どのように見えるかを確認してください。:
しかしながら、ボタンが、クリックされたとき、何が起こるかを指定するコードが書かれていないため、あなたは、ボタンをクリックしても、効果がないことに気が付きます。
これは、VBAフォーム・デザイナで、コマンド・ボタンをダブルクリックするだけで実行できます。たとえば、「画像のサイズ変更」ボタンをダブルクリックします。これにより、ユーザー・フォームのコード・ウィンドウが開きます。そして、cmdResizeコントロールのマウス・クリックのイベント・ハンドラーを追加します。:
cmdResize_Click()イベント・ハンドラの実装を次のように変更します。:
Private Sub cmdResize_Click()
MsgBox "Button clicked"
End Sub
これにより、ボタンが、クリックされるとき、メッセージボックスを表示する簡単なコードが追加されます。:
次に、ソースの出力先フォルダのために、Browseボタンを実装します。これには、VBAでは直接利用できない、Windowsの"フォルダの参照"ダイアログが必要です。しかしながら、VBAは、低レベルのWindows API関数を使用できます。そして、Corel PHOTO-PAINT HTMLスライドショーマクロの一部であり、このため、利用可能なコードがすでに存在しています。あなたは、そのマクロから、そのコードを直接自分のコードにコピーできます。VBAのプロジェクト・エクスプローラで、HTMLSlideshowマクロ・プロジェクトを拡大します。そして、"FolderPicker"モジュールの場所を見つけます。それを選択し、ImageResizerプロジェクトにドラッグします。:
これにより、FolderPickerモジュールが、ImageResizerにコピーされます。そして、そのコードは、現在、私たちのマクロの中でも使用することができます。両方のBrowseボタンのために、2つのボタンのクリック・イベント・ハンドラを追加して、以下のように、それらの実装を提供します。:
Private Sub cmdBrowseDest_Click()
Dim folder As String
folder = BrowseForFolderDlg(txtDestFolder.Text, _
"Select Destination Folder", _
GetWindowHandle("ThunderDFrame", Me.Caption))
If folder = "" Then Exit Sub
txtDestFolder.Text = folder
End Sub
Private Sub cmdBrowseSource_Click()
Dim folder As String
folder = BrowseForFolderDlg(txtSourceFolder.Text, _
"Select Source Folder", _
GetWindowHandle("ThunderDFrame", Me.Caption))
If folder = "" Then Exit Sub
txtSourceFolder.Text = folder
End Sub
ここでは、これらのコントロールに入力されている現在のフォルダー名を取得するには、異なるテキスト・コントロール(txtSourceFolderとtxtDestFolder)を使用することを除いて、両方のイベント・ハンドラは、ほとんど同じです。FolderPickerモジュールから、BrowseForFolderDlg()関数を呼び出します。そして、返された新しいフォルダ・パスは、対応するテキスト・ボックスに戻されます。
画像処理機能の追加
Adding Image Processing Functionality
次に、私たちは、すべての画像操作を行うためのメイン画像処理機能を実装する準備が整いました。cmdResize_Click()関数を次のように変更します。:
Private Sub cmdResize_Click()
Dim sourceFolder As String, destFolder As String
Dim width As Long, height As Long
Dim maintainAspect As Boolean
sourceFolder = txtSourceFolder.Text
If (CorelScriptTools.FileAttr(sourceFolder) And vbDirectory) = 0 Then
MsgBox "Invalid source folder " & sourceFolder, vbCritical
Exit Sub
End If
If Right(sourceFolder, 1) <> "\" Then sourceFolder = sourceFolder & "\"
destFolder = txtDestFolder.Text
If (CorelScriptTools.FileAttr(destFolder) And vbDirectory) = 0 Then
MsgBox "Invalid destination folder " & destFolder, vbCritical
Exit Sub
End If
If Right(destFolder, 1) <> "\" Then destFolder = destFolder & "\"
If Not IsNumeric(txtWidth.Text) Then
MsgBox "Invalid width", vbCritical
Exit Sub
End If
width = CLng(txtWidth.Text)
If Not IsNumeric(txtHeight.Text) Then
MsgBox "Invalid height", vbCritical
Exit Sub
End If
height = CLng(txtHeight.Text)
maintainAspect = cbMaintainProportions.Value
ResizeImages sourceFolder, destFolder, width, height, maintainAspect
Unload Me
End Sub
この関数は、ソースと宛先フォルダのテキスト・ボックスから入力を受け取ります。そして、有効なフォルダ名が、含まれていることを検証します。続いて、画像の必要な幅と高さをテキストボックス(文字列)の内容から、画像の大きさを変更するときに使用する整数に変換します。
最後に、ResizeImages関数を呼び出して、実際の画像変換を行います。すべての画像が、ResizeImages内で処理された後、ダイアログは、Unloadメソッドを呼び出すことで、閉じられます。
ResizeImagesは、sourceFolderで識別されるフォルダー内のすべてのファイルを反復処理し、それぞれをCorel PHOTO-PAINTで開き、それぞれの画像の大きさを変更し、それらをJPEGとして、destFolderで指定された出力フォルダーに保存します。maintainAspect変数が、Trueに設定されているとき、画像のアスペクト比を保持するための追加のロジックがあります。
Sub ResizeImages(ByVal sourceFolder As String, ByVal destFolder As String, _
ByVal width As Long, ByVal height As Long, _
ByVal maintainAspect As Boolean)
Dim f As String
Dim doc As Document, w As Long, h As Long
f = Dir(sourceFolder & "*.*")
While f <> ""
doc = OpenDocument(sourceFolder & f)
w = width
h = height
If maintainAspect Then
If w * doc.SizeHeight < h * doc.SizeWidth Then
h = h * doc.SizeHeight / doc.SizeWidth
Else
w = w * doc.SizeWidth / doc.SizeHeight
End If
End If
doc.Resample w, h
doc.SaveAs(destFolder & f, cdrJPEG).Finish
doc.Close
f = Dir()
Wend
End Sub
次に、私たちは、カスタム・ダイアログを表示する、完全に機能的なマクロを持っています。ユーザー入力を受け入れて、Corel PHOTO-PAINTを使用して、たくさんの画像を処理します。気軽にソースコードを試してください。そして、あなたが、日々の仕事で遭遇するかもしれない問題に、より多くの複雑な解決策を構築します。
ダウンロード・ソース:MacroUI.zip