生成AIと100本ノック 29本目:画像の挿入
AIのGeminiがVBA100本ノックに挑戦!
ということでシリーズを開始しましたが、ある程度回もすすんだので、検証方法を変更することにしました。
そこで、このプロンプトのさらなる改善と最終検証を目的として、100本ノックを進めていくことにします。
🤖 ChatGPT(GPT-3.5)(無課金の無料版)
🤖 Claude(Sonnet4)(無課金の無料版)
VBA100本ノックの出題と解答
生成AIへの出題
ファイル選択ダイアログで画像ファイルを指定し、その画像をアクティブセルにリンクしない図として貼り付けてください。
貼り付けた画像は、縦横比を維持したままセル内に収めてください。
セル内の位置はなるべく真ん中に。
※選択できる拡張子は適当に。
Geminiの回答
ファイル選択ダイアログで指定した画像を、アクティブセルにリンクせずに貼り付け、縦横比を維持したままセル内の中央に配置するVBAコードを、ご指定の要件に従って作成します。
Option Explicit
'================================================================================
' メインモジュール
'================================================================================
'-----------------------------------------
' 機能: 全体的な処理フローを制御し、アクティブセルに画像ファイルを挿入する
' 引数: なし
' 戻り値: なし
' 備考: 処理の開始と終了時にアプリケーション設定を制御します。
'-----------------------------------------
Public Sub Main_InsertPictureToCell()
'--- 高速化設定 ---
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
.EnableEvents = False
.DisplayAlerts = False
End With
On Error GoTo ErrorHandler
'--- 事前チェック ---
' アクティブなものがセル(Range)であるかを確認
If TypeName(Selection) <> "Range" Then
MsgBox "処理を実行する前に、画像を挿入したいセルを選択してください。", vbExclamation
GoTo ExitHandler
End If
' 選択されているセルが単一であるかを確認
If Selection.Cells.CountLarge > 1 Then
MsgBox "画像を挿入できるのは単一のセルのみです。一つのセルを選択してください。", vbExclamation
GoTo ExitHandler
End If
Dim rngTarget As Range
Set rngTarget = ActiveCell
'--- 画像ファイル選択 ---
Dim strPicPath As String
strPicPath = GetPicturePath()
If strPicPath = "" Then GoTo ExitHandler ' キャンセル時は処理を中断
'--- 画像挿入と調整 ---
Call InsertAndAdjustPicture(rngTarget, strPicPath)
MsgBox "画像の挿入が完了しました。", vbInformation
ExitHandler:
'--- 高速化設定を元に戻す ---
With Application
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.EnableEvents = True
.DisplayAlerts = True
End With
Set rngTarget = Nothing
Exit Sub
ErrorHandler:
MsgBox "予期せぬエラーが発生しました。" & vbCrLf & vbCrLf & _
"エラー箇所: Main_InsertPictureToCell" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
"エラー内容: " & Err.Description, vbCritical
Resume ExitHandler
End Sub
'================================================================================
' データ加工・ロジック / 出力・書き込み プロシージャー
'================================================================================
'-----------------------------------------
' 機能: 指定されたセルに画像を挿入し、セルのサイズに合わせて中央に配置する
' 引数: rngTarget (Range) - 画像を挿入する対象のセル
' strPicPath (String) - 画像ファイルのフルパス
' 戻り値: なし
' 備考: 画像はリンクせず、ドキュメントに埋め込まれます。
' 縦横比は維持され、画像がセルより小さい場合は拡大されません。
'-----------------------------------------
Private Sub InsertAndAdjustPicture(ByVal rngTarget As Range, ByVal strPicPath As String)
Dim shp As Object 'As Shape
On Error GoTo ErrorHandler
' 画像をシートに挿入 (元のサイズで一旦挿入)
Set shp = rngTarget.Parent.Shapes.AddPicture( _
Filename:=strPicPath, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=rngTarget.Left, _
Top:=rngTarget.Top, _
Width:=-1, _
Height:=-1) ' -1は元のサイズを指定
With shp
' 縦横比を固定
.LockAspectRatio = msoTrue
'--- セル内に収まるようにサイズ調整 ---
Dim dblCellWidth As Double
Dim dblCellHeight As Double
dblCellWidth = rngTarget.Width
dblCellHeight = rngTarget.Height
' 画像がセルの幅または高さを超えている場合のみリサイズ
If .Width > dblCellWidth Or .Height > dblCellHeight Then
Dim dblRatioW As Double
Dim dblRatioH As Double
dblRatioW = dblCellWidth / .Width
dblRatioH = dblCellHeight / .Height
' より縮小率が大きい方(値が小さい方)に合わせてリサイズ
If dblRatioW < dblRatioH Then
.Width = dblCellWidth ' 幅をセルに合わせる(高さは縦横比固定で自動調整)
Else
.Height = dblCellHeight ' 高さをセルに合わせる(幅は縦横比固定で自動調整)
End If
End If
'--- 中央に配置 ---
.Left = rngTarget.Left + (dblCellWidth - .Width) / 2
.Top = rngTarget.Top + (dblCellHeight - .Height) / 2
End With
Set shp = Nothing
Exit Sub
ErrorHandler:
' エラーが発生した場合、作成された可能性のあるShapeオブジェクトを削除
If Not shp Is Nothing Then
On Error Resume Next ' Deleteでエラーが出ても無視
shp.Delete
On Error GoTo 0
End If
' エラーを呼び出し元に伝播させる
Err.Raise Err.Number, "InsertAndAdjustPicture", Err.Description
End Sub
'================================================================================
' ユーティリティ プロシージャー
'================================================================================
'-----------------------------------------
' 機能: ファイル選択ダイアログを表示し、ユーザーに画像ファイルを選択させる
' 引数: なし
' 戻り値: String - 選択された画像ファイルのフルパス。キャンセルの場合は空文字列。
' 備考: 一般的な画像形式をフィルタリングします。
'-----------------------------------------
Private Function GetPicturePath() As String
Dim fd As Object 'Office.FileDialog
Set fd = Application.FileDialog(msoFileDialogFilePicker)
With fd
.Title = "画像ファイルを選択してください"
.AllowMultiSelect = False
.Filters.Clear
.Filters.Add "画像ファイル", "*.jpg; *.jpeg; *.png; *.gif; *.bmp", 1
.Filters.Add "JPEG ファイル (*.jpg, *.jpeg)", "*.jpg; *.jpeg", 2
.Filters.Add "PNG ファイル (*.png)", "*.png", 3
.Filters.Add "GIF ファイル (*.gif)", "*.gif", 4
.Filters.Add "BMP ファイル (*.bmp)", "*.bmp", 5
.Filters.Add "すべてのファイル (*.*)", "*.*", 6
.FilterIndex = 1 ' 初期表示は「画像ファイル」
' ダイアログを表示し、ファイルが選択されたか確認
If .Show = -1 Then 'OKボタンが押された場合 (True)
GetPicturePath = .SelectedItems(1)
Else 'キャンセルボタンが押された場合 (False)
GetPicturePath = ""
End If
End With
Set fd = Nothing
End Function
VBAコードの解説
- 1. 概要
このVBAコードは、ユーザーがファイル選択ダイアログを通じて選んだ画像ファイルを、Excelのアクティブセル内に自動でサイズ調整して中央に配置する機能を提供します。画像はファイルへのリンクではなく、Excelファイル自体に埋め込まれるため、元の画像ファイルを移動・削除しても表示が維持されます。 - 2. 主な機能と特徴
- 対話的なファイル選択: FileDialog オブジェクトを使用し、ユーザーが直感的に画像ファイルを選択できます。
- 画像の自動調整: 選択された画像を、指定されたセルのサイズに合わせて縦横比を維持したままリサイズし、セルの中央に配置します。画像がセルより小さい場合は、拡大されません。
- 堅牢な設計:
- エラーハンドリング: 処理中に予期せぬエラーが発生しても、アプリケーションを安定した状態に保ち、ユーザーに分かりやすいメッセージを表示します。
- 高速化処理: 画像挿入処理中の画面描画やイベント発生を一時的に停止し、スムーズな動作を実現します。
- 高保守性: 機能ごとにプロシージャを分割(メイン処理、画像挿入・調整、ファイルパス取得)しており、コードの可読性が高く、将来の修正や機能追加が容易です。
- 3. ご利用方法
- ExcelのVBE(Visual Basic Editor)を開きます (Alt + F11)。
- 「挿入」メニューから「標準モジュール」を選択します。
- 上記VBAコードをコピーして、表示されたモジュールウィンドウに貼り付けます。
- Excelシートに戻り、画像を挿入したいセルを一つだけ選択します。
- Alt + F8 を押してマクロダイアログを開き、Main_InsertPictureToCell を選択して「実行」ボタンを押します。
- ファイル選択ダイアログが表示されるので、目的の画像ファイルを選択して「開く」をクリックします。
- 4. 各プロシージャの解説
- Main_InsertPictureToCell (メインプロシージャ)
全体の処理の流れを制御します。- 高速化設定: 処理の開始時に画面更新などを停止し、終了時に元に戻します。
- 事前チェック: ユーザーが単一のセルを選択しているかを確認し、不適切な場合はメッセージを表示して処理を中断します。
- プロシージャ呼び出し: GetPicturePath を呼び出して画像のパスを取得し、InsertAndAdjustPicture を呼び出して画像の挿入と調整を実行します。
- エラーハンドリング: On Error GoTo を使用して、モジュール全体で発生した予期せぬエラーを捕捉し、ユーザーに通知します。
- InsertAndAdjustPicture (画像挿入・調整プロシージャ)
実際に画像を挿入し、調整する中核部分です。- 画像挿入: Shapes.AddPicture メソッドを使用して、画像をシートに追加します。この際、LinkToFile:=False, SaveWithDocument:=True を指定することで、画像をExcelファイルに埋め込みます。
- サイズ調整: LockAspectRatio = msoTrue で画像の縦横比を固定した後、セルの大きさと画像の大きさを比較します。画像がセルより大きい場合、セルの幅か高さのどちらか小さい方の比率に合わせて画像を縮小します。
- 中央配置: 画像の Left プロパティと Top プロパティを計算し、セルの中央に配置されるように調整します。
- エラー伝播: このプロシージャ内でエラーが発生した場合、作成途中の画像を削除した後、Err.Raise を使ってエラー情報を呼び出し元の Main_InsertPictureToCell に伝播させます。
- GetPicturePath (ファイルパス取得関数)
Application.FileDialog を使用してファイル選択ダイアログを表示し、ユーザーが選択したファイルのパスを取得するユーティリティ関数です。- フィルタ設定: Filters.Add を用いて、JPEG, PNG, GIF, BMPといった一般的な画像形式を絞り込み候補として表示します。
- 戻り値: ユーザーがファイルを選択して「開く」を押した場合はそのファイルのフルパスを返します。「キャンセル」が押された場合は空文字列 ("") を返し、メインプロシージャはこれを受け取って処理を安全に中断します。
- Main_InsertPictureToCell (メインプロシージャ)
VBAは問題ないですね。
説明も丁寧です。
ChatGPTの回答
Option Explicit
'-----------------------------------------
' 機能: メイン処理(画像貼り付け処理の統括とエラーハンドリング)
' 引数: なし
' 戻り値: なし
' 備考: 設定変更と復元を含む
'-----------------------------------------
Public Sub InsertImageIntoActiveCell()
Dim blnSuccess As Boolean
Dim lngCalcState As XlCalculation
Dim blnEventsState As Boolean
Dim blnDisplayAlertsState As Boolean
Dim blnScreenUpdatingState As Boolean
On Error GoTo ErrorHandler
' 高速化設定保存
lngCalcState = Application.Calculation
blnEventsState = Application.EnableEvents
blnDisplayAlertsState = Application.DisplayAlerts
blnScreenUpdatingState = Application.ScreenUpdating
' 高速化設定
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayAlerts = False
' 初期化処理(画像ファイル選択)
Dim strImagePath As String
strImagePath = SelectImageFile()
If strImagePath = "" Then Exit Sub
' 出力処理(画像貼り付け)
blnSuccess = InsertAndResizeImage(strImagePath, ActiveCell)
If Not blnSuccess Then
MsgBox "画像の貼り付けに失敗しました。", vbExclamation
End If
Cleanup:
' 設定を元に戻す
Application.Calculation = lngCalcState
Application.EnableEvents = blnEventsState
Application.DisplayAlerts = blnDisplayAlertsState
Application.ScreenUpdating = blnScreenUpdatingState
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました。" & vbCrLf & _
"番号: " & Err.Number & vbCrLf & _
"内容: " & Err.Description & vbCrLf & _
"プロシージャ: InsertImageIntoActiveCell", vbCritical
Resume Cleanup
End Sub
'-----------------------------------------
' 機能: ファイル選択ダイアログで画像ファイルを選択
' 引数: なし
' 戻り値: String - 選択された画像ファイルのフルパス、未選択の場合は空文字
' 備考: 拡張子はjpg, png, bmp, gifに対応
'-----------------------------------------
Private Function SelectImageFile() As String
Dim strFilePath As String
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "画像ファイルを選択してください"
.Filters.Clear
.Filters.Add "画像ファイル", "*.jpg;*.jpeg;*.png;*.bmp;*.gif"
.AllowMultiSelect = False
If .Show = -1 Then
strFilePath = .SelectedItems(1)
End If
End With
SelectImageFile = strFilePath
End Function
'-----------------------------------------
' 機能: 指定セルに画像を縦横比を保ち中央配置で貼り付け
' 引数: strImagePath (String) - 画像ファイルパス
' rngTarget (Range) - 画像を貼り付けるセル
' 戻り値: Boolean - 貼り付け成功時 True
' 備考: 図として貼り付け、リンクしない
'-----------------------------------------
Private Function InsertAndResizeImage(ByVal strImagePath As String, ByVal rngTarget As Range) As Boolean
On Error GoTo ErrorHandler
Dim shp As Shape
Dim ws As Worksheet
Dim dblCellLeft As Double, dblCellTop As Double
Dim dblCellWidth As Double, dblCellHeight As Double
Dim dblImageWidth As Double, dblImageHeight As Double
Dim dblScale As Double
Set ws = rngTarget.Worksheet
' 画像を挿入(リンクなしの図として)
Set shp = ws.Shapes.AddPicture( _
Filename:=strImagePath, _
LinkToFile:=msoFalse, _
SaveWithDocument:=msoCTrue, _
Left:=0, Top:=0, Width:=-1, Height:=-1)
' 対象セルのサイズ取得
dblCellLeft = rngTarget.Left
dblCellTop = rngTarget.Top
dblCellWidth = rngTarget.Width
dblCellHeight = rngTarget.Height
' 画像の元サイズを取得
dblImageWidth = shp.Width
dblImageHeight = shp.Height
' 縦横比を維持してセル内に収めるためのスケール計算
dblScale = WorksheetFunction.Min(dblCellWidth / dblImageWidth, dblCellHeight / dblImageHeight)
shp.LockAspectRatio = msoTrue
shp.Width = dblImageWidth * dblScale
shp.Height = dblImageHeight * dblScale
' セルの中央に配置
shp.Left = dblCellLeft + (dblCellWidth - shp.Width) / 2
shp.Top = dblCellTop + (dblCellHeight - shp.Height) / 2
InsertAndResizeImage = True
Exit Function
ErrorHandler:
InsertAndResizeImage = False
End Function
コードの解説
全体構成(5分割)
種別 | プロシージャ名 | 役割 |
メイン | InsertImageIntoActiveCell | 全体制御・高速化設定・エラー処理 |
初期化 | SelectImageFile | 画像ファイルの選択ダイアログ表示 |
出力処理 | InsertAndResizeImage | 非リンクで画像挿入+サイズ調整+中央配置 |
ユーティリティ | - | 関数内に吸収(汎用化不要と判断) |
データ加工 | - | 該当なし(本件では不要) |
- 非リンク画像挿入:Shapes.AddPicture(..., LinkToFile:=msoFalse) を使用。
- セル内中央配置・縦横比維持:スケール比計算し、LockAspectRatio + 手動配置で実現。
- 高速化対応:Application.ScreenUpdating など4項目を保存/復元。
- 堅牢性:すべてのプロシージャで On Error によるハンドリング実装。
- 再利用性と保守性:画像処理ロジックを独立関数化、ファイル選択UIを分離。
ご希望があれば以下のような改良も可能です:
- アクティブセルが結合セルかどうかの検出と考慮
- 図形名の自動命名や管理
- 複数画像の一括挿入(複数選択対応)
- セルサイズを画像サイズに合わせて自動調整 など
- 必要があればお申し付けください。
VBAは良いですね。
説明はいつもながら簡潔です。ちょっと物足りないですが(笑)
Claudeの回答
Option Explicit
'-----------------------------------------
' 機能: 画像ファイルを選択してアクティブセルに貼り付ける(メイン処理)
' 引数: なし
' 戻り値: なし
' 備考: 高速化設定を適用し、エラーハンドリングを実装
'-----------------------------------------
Sub InsertImageToActiveCell()
Dim strFilePath As String
Dim rngTargetCell As Range
Dim objShape As Object
Dim dblCellWidth As Double
Dim dblCellHeight As Double
' 高速化設定を適用
Call EnableFastProcessing
On Error GoTo ErrorHandler
' 画像ファイルを選択
strFilePath = SelectImageFile()
If strFilePath = "" Then
GoTo ExitHandler
End If
' アクティブセルを取得
Set rngTargetCell = ActiveCell
' セルの寸法を取得
Call GetCellDimensions(rngTargetCell, dblCellWidth, dblCellHeight)
' 画像を挿入
Set objShape = InsertImageAsShape(strFilePath, rngTargetCell)
' 画像をセル内に配置・調整
Call AdjustImageToFitCell(objShape, rngTargetCell, dblCellWidth, dblCellHeight)
GoTo ExitHandler
ErrorHandler:
Call HandleError("InsertImageToActiveCell", Err.Number, Err.Description)
ExitHandler:
' 設定を復元
Call RestoreOriginalSettings
End Sub
'-----------------------------------------
' 機能: 画像ファイル選択ダイアログを表示
' 引数: なし
' 戻り値: String - 選択されたファイルパス(キャンセル時は空文字)
' 備考: 画像ファイルのみ選択可能
'-----------------------------------------
Private Function SelectImageFile() As String
Dim varResult As Variant
On Error GoTo ErrorHandler
' ファイル選択ダイアログを表示
varResult = Application.GetOpenFilename( _
"画像ファイル (*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tiff;*.tif),*.jpg;*.jpeg;*.png;*.gif;*.bmp;*.tiff;*.tif," & _
"JPEG (*.jpg;*.jpeg),*.jpg;*.jpeg," & _
"PNG (*.png),*.png," & _
"GIF (*.gif),*.gif," & _
"BMP (*.bmp),*.bmp," & _
"TIFF (*.tiff;*.tif),*.tiff;*.tif", _
, "画像ファイルを選択してください")
If varResult <> False Then
SelectImageFile = CStr(varResult)
Else
SelectImageFile = ""
End If
Exit Function
ErrorHandler:
SelectImageFile = ""
Call HandleError("SelectImageFile", Err.Number, Err.Description)
End Function
'-----------------------------------------
' 機能: セルの幅と高さを取得
' 引数: rngCell (Range) - 対象セル
' dblWidth (Double) - セル幅(参照渡し)
' dblHeight (Double) - セル高さ(参照渡し)
' 戻り値: なし
' 備考: ポイント単位で取得
'-----------------------------------------
Private Sub GetCellDimensions(ByRef rngCell As Range, ByRef dblWidth As Double, ByRef dblHeight As Double)
On Error GoTo ErrorHandler
dblWidth = rngCell.Width
dblHeight = rngCell.Height
Exit Sub
ErrorHandler:
' デフォルト値を設定
dblWidth = 100
dblHeight = 20
Call HandleError("GetCellDimensions", Err.Number, Err.Description)
End Sub
'-----------------------------------------
' 機能: 画像ファイルをShapeオブジェクトとして挿入
' 引数: strFilePath (String) - 画像ファイルパス
' rngCell (Range) - 挿入対象セル
' 戻り値: Object - 挿入されたShapeオブジェクト
' 備考: リンクなしで挿入
'-----------------------------------------
Private Function InsertImageAsShape(ByVal strFilePath As String, ByRef rngCell As Range) As Object
Dim objShape As Object
On Error GoTo ErrorHandler
' 画像をShapeオブジェクトとして挿入(リンクなし)
Set objShape = rngCell.Worksheet.Shapes.AddPicture( _
Filename:=strFilePath, _
LinkToFile:=False, _
SaveWithDocument:=True, _
Left:=rngCell.Left, _
Top:=rngCell.Top, _
Width:=-1, _
Height:=-1)
Set InsertImageAsShape = objShape
Exit Function
ErrorHandler:
Set InsertImageAsShape = Nothing
Call HandleError("InsertImageAsShape", Err.Number, Err.Description & " ファイル: " & strFilePath)
End Function
'-----------------------------------------
' 機能: 画像をセル内に収まるように調整・配置
' 引数: objShape (Object) - 調整対象のShapeオブジェクト
' rngCell (Range) - 配置対象セル
' dblCellWidth (Double) - セル幅
' dblCellHeight (Double) - セル高さ
' 戻り値: なし
' 備考: 縦横比を維持してセル中央に配置
'-----------------------------------------
Private Sub AdjustImageToFitCell(ByRef objShape As Object, ByRef rngCell As Range, _
ByVal dblCellWidth As Double, ByVal dblCellHeight As Double)
Dim dblImageWidth As Double
Dim dblImageHeight As Double
Dim dblScaleRatio As Double
Dim dblNewWidth As Double
Dim dblNewHeight As Double
Dim dblOffsetX As Double
Dim dblOffsetY As Double
On Error GoTo ErrorHandler
If objShape Is Nothing Then Exit Sub
' 元の画像サイズを取得
dblImageWidth = objShape.Width
dblImageHeight = objShape.Height
' 縦横比を維持しながらセル内に収まるスケール比を計算
dblScaleRatio = Application.WorksheetFunction.Min(dblCellWidth / dblImageWidth, dblCellHeight / dblImageHeight)
' 新しいサイズを計算
dblNewWidth = dblImageWidth * dblScaleRatio
dblNewHeight = dblImageHeight * dblScaleRatio
' セル中央に配置するためのオフセットを計算
dblOffsetX = (dblCellWidth - dblNewWidth) / 2
dblOffsetY = (dblCellHeight - dblNewHeight) / 2
' 画像のサイズと位置を設定
With objShape
.Width = dblNewWidth
.Height = dblNewHeight
.Left = rngCell.Left + dblOffsetX
.Top = rngCell.Top + dblOffsetY
End With
Exit Sub
ErrorHandler:
Call HandleError("AdjustImageToFitCell", Err.Number, Err.Description)
End Sub
'-----------------------------------------
' 機能: 高速化設定を適用
' 引数: なし
' 戻り値: なし
' 備考: 処理速度向上のため各種設定を無効化
'-----------------------------------------
Private Sub EnableFastProcessing()
On Error Resume Next
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayAlerts = False
On Error GoTo 0
End Sub
'-----------------------------------------
' 機能: 元の設定を復元
' 引数: なし
' 戻り値: なし
' 備考: 高速化設定を元に戻す
'-----------------------------------------
Private Sub RestoreOriginalSettings()
On Error Resume Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayAlerts = True
On Error GoTo 0
End Sub
'-----------------------------------------
' 機能: エラーハンドリング処理
' 引数: strProcedureName (String) - エラー発生プロシージャ名
' lngErrorNumber (Long) - エラー番号
' strErrorDescription (String) - エラー内容
' 戻り値: なし
' 備考: ユーザーにエラー情報を表示
'-----------------------------------------
Private Sub HandleError(ByVal strProcedureName As String, ByVal lngErrorNumber As Long, ByVal strErrorDescription As String)
Dim strMessage As String
strMessage = "エラーが発生しました。" & vbCrLf & vbCrLf & _
"プロシージャ: " & strProcedureName & vbCrLf & _
"エラー番号: " & lngErrorNumber & vbCrLf & _
"エラー内容: " & strErrorDescription
MsgBox strMessage, vbCritical, "エラー"
End Sub
VBAコードの解説
作成したVBAコードは、以下の機能を持つ業務品質レベルの自動化コードです:
主要機能
- ファイル選択ダイアログ:画像ファイル(JPG、PNG、GIF、BMP、TIFF)を選択可能
- リンクなし貼り付け:選択した画像をリンクしない図としてアクティブセルに挿入
- 縦横比維持:画像の元の縦横比を保持したままセル内に収める
- 中央配置:画像をセル内の中央に配置
プロシージャー構成
- InsertImageToActiveCell:メインプロシージャー、全体的な処理フローを制御
- SelectImageFile:ファイル選択ダイアログの表示と結果取得
- GetCellDimensions:セルの幅と高さの取得
- InsertImageAsShape:画像ファイルをShapeオブジェクトとして挿入
- AdjustImageToFitCell:画像のサイズ調整と位置設定
- EnableFastProcessing / RestoreOriginalSettings:高速化設定の適用と復元
- HandleError:統一されたエラーハンドリング
設計上の特徴
- 高凝集・低結合:各プロシージャーが単一の責任を持ち、独立性が保たれています
- 堅牢なエラーハンドリング:各プロシージャーでエラーを適切にキャッチし、ユーザーに分かりやすいメッセージを表示
- 高速化処理:処理開始時に画面更新等を無効化し、終了時に復元
- 保守性:意味のある名前付け、適切なコメント、明確なコード構造
使用方法
- VBAエディターで標準モジュールに貼り付け
- InsertImageToActiveCellプロシージャーを実行
- ファイル選択ダイアログで画像ファイルを選択
- 選択した画像がアクティブセルに縦横比を維持したまま中央配置で挿入されます
このコードは業務利用に適した品質で、エラー処理、高速化、保守性を兼ね備えています。
VBAはもちろん良いです。
説明も適切で読みやすいと思います。
同じテーマ「生成AI活用研究」の記事
Geminiと100本ノック 19本目:図形のコピー
Geminiと100本ノック 20本目:ブックのバックアップ
Geminiと100本ノック 21本目:バックアップファイルの削除
Geminiと100本ノック 22本目:FizzBuzz発展問題
Geminiと100本ノック 23本目:シート構成の一致確認
Geminiと100本ノック 24本目:全角英数のみ半角
Geminiと100本ノック 25本目:マトリックス表をDB形式に変換
生成AIと100本ノック 26本目:ファイル一覧作成
生成AIと100本ノック 27本目:ハイパーリンクのURL
生成AIと100本ノック 28本目:シートをブックに分割
生成AIと100本ノック 29本目:画像の挿入
新着記事NEW ・・・新着記事一覧を見る
VBA開発の標準化を実現する共通プロンプトのすすめ|生成AI活用研究(2025-06-14)
生成AIと100本ノック 29本目:画像の挿入|生成AI活用研究(6月13日)
Excelワークシート関数全一覧(最新版)|Excelリファレンス(6月12日)
エクセル関数辞典 AI版|エクセル入門(6月10日)
生成AIと100本ノック 28本目:シートをブックに分割|生成AI活用研究(6月8日)
生成AIと脱Excelの時代:ブラックボックスと共に進む知的変革|生成AI活用研究(2025-06-08)
生成AIと100本ノック 27本目:ハイパーリンクのURL|生成AI活用研究(6月7日)
生成AIと100本ノック 26本目:ファイル一覧作成|生成AI活用研究(6月6日)
AI時代のプログラミング再考:記述の自由と知の民主化|生成AI活用研究(2025-06-06)
Excel×スプレッドシート連携:HTTP GETで学ぶGAS API設計入門|生成AI活用研究(2025-06-04)
アクセスランキング ・・・ ランキング一覧を見る
1.最終行の取得(End,Rows.Count)|VBA入門
2.変数宣言のDimとデータ型|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.FILTER関数(範囲をフィルター処理)|エクセル入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門
このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。