LoginSignup
koook
@koook

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

VBAで可視セルのみをリンク貼付けする処理を行うマクロ

解決したいこと

vbaで可視セルのみをリンク貼付けする処理を行うマクロを作成中です。
web記事で紹介されていた可視セルのみを値貼付けする処理を行うマクロを参考に作成しているのですが、下記のとおりエラーが発生してしまいます。
なお、参考にしたマクロで記述されていた変数の定義等、本処理には無関係なコードが残っているかと思われます。
ご教示くださいますようお願いいたします。

作業環境
macOS sonoma office365
*windows11 excel2021でも同様のエラーあり。

発生している問題・エラー

WorksheetクラスのPasteメソッドが失敗しました。

とエラー表示され、

ActiveSheet.Paste Link:=True

にマーカーされます。

該当するソースコード

Option Explicit

Dim FilePath As String
Dim FileName As String
Dim Pos As Long
Dim wb As Workbook
Dim ws As Worksheet
Dim Target As Range, cTarget As Range, vTarget As Range
Dim i As Integer, j As Integer, k As Integer
Dim cpcnt As Integer
Dim trg As Range
Dim myArray() As Variant
Dim cpcntRow As Long, cpcntCol As Long
Dim vcntRow As Long, vcntCol As Long
Dim cntRow As Long, cntCol As Long
Dim rc As Integer


Sub visible_copy_pastelink()

Range(Cells(2, 3), Cells(3, 5)).ClearContents '入力フォームの記入を削除

'ダイアログからコピーファイルを開く
FilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 'FilePath変数に対象ブックのパスを格納する(Excel ブックだけを候補に表示)
Pos = InStrRev(FilePath, "\") 'ファイル名の文字位置を検索
FileName = Mid(FilePath, Pos + 1) 'ファイル名の取得

    If FilePath <> "False" Then
        For Each wb In Workbooks
            If wb.FullName = FilePath Then
                Workbooks(FileName).Close
            End If
        Next wb
        Workbooks.Open FilePath, ReadOnly:=True '読み取り専用で開く
    Else
        Exit Sub
    End If
    
    'ダイアログからシートを選択
    Set ws = ShowSelectSheetDialog()
    ws.Activate
    
    On Error Resume Next
    Set Target = Application.InputBox("参照範囲を選択してください", Type:=8)
    On Error GoTo 0
    
    If Target Is Nothing Then Exit Sub
    
    'コピー範囲の行列数の取得
    Target.Select
    Set cTarget = Selection.SpecialCells(xlCellTypeVisible)
    
    cTarget.Select
    Selection.Copy
    
    cpcnt = cTarget.Count

    cntRow = 0
    cntCol = 0
    With Selection
        For i = 1 To .Areas.Count
            cntRow = cntRow + .Areas(i).Rows.Count
            cntCol = cntCol + .Areas(i).Columns.Count
        Next i
    End With

    cpcntRow = 0
    cpcntCol = 0
    
    With ActiveCell
        j = 1
        For k = 1 To cntRow
            If .Offset(k - 1, j - 1).EntireRow.Hidden = False Then
                    cpcntRow = cpcntRow + 1
                For j = 1 To cntCol
                    If .Offset(k - 1, j - 1).EntireColumn.Hidden = False Then
                        cpcntCol = cpcntCol + 1
                    End If
                Next j
            End If
        Next k
    End With
    
    With ThisWorkbook.Sheets(1)
        .Cells(2, 3) = Target.Parent.Name
        .Cells(2, 4) = Target.Address
        .Cells(2, 5) = FilePath
    End With

'ダイアログからコピーファイルを開く
FilePath = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") 'FilePath変数に対象ブックのパスを格納する(Excel ブックだけを候補に表示)
Pos = InStrRev(FilePath, "\") 'ファイル名の文字位置を検索
FileName = Mid(FilePath, Pos + 1) 'ファイル名の取得

    If FilePath <> "False" Then
        For Each wb In Workbooks
            If wb.FullName = FilePath Then
                Workbooks(FileName).Close
            End If
        Next wb
        Workbooks.Open FilePath, ReadOnly:=True '読み取り専用で開く
    Else
        Exit Sub
    End If
    
    'ダイアログからシートを選択
    Set ws = ShowSelectSheetDialog()
    ws.Activate
    
    On Error Resume Next
        Set Target = Application.InputBox("貼付け範囲を選択してください", Type:=8)
    On Error GoTo 0
    If Target Is Nothing Then Exit Sub
    
    '貼付け範囲の行列数の取得
    Target.Select
    Set vTarget = Selection.SpecialCells(xlCellTypeVisible)
    
    cpcnt = vTarget.Count

    cntRow = 0
    cntCol = 0
    With Selection
        For i = 1 To .Areas.Count
            cntRow = cntRow + .Areas(i).Rows.Count
            cntCol = cntCol + .Areas(i).Columns.Count
        Next i
    End With

    vcntRow = 0
    vcntCol = 0
    
    With ActiveCell
        j = 1
        For k = 1 To cntRow
            If .Offset(k - 1, j - 1).EntireRow.Hidden = False Then
                    vcntRow = vcntRow + 1
                For j = 1 To cntCol
                    If .Offset(k - 1, j - 1).EntireColumn.Hidden = False Then
                        vcntCol = vcntCol + 1
                    End If
                Next j
            End If
        Next k
    End With
    
    '可視セルのコピーセルと貼付けセルの数の確認
    
    If cpcnt <> vTarget.Count Then
        MsgBox "参照セルと貼付けセルの数が一致しません。確認して下さい。"
        Exit Sub
    End If

    If cpcntRow <> vcntRow Or cpcntCol <> vcntCol Then
        MsgBox "参照セルと貼付けセルの行列の数が一致しません。確認して下さい。"
        Exit Sub
    End If
    
    vTarget.Select
    Application.EnableEvents = False
    ActiveSheet.Paste Link:=True

    Sheets(Target.Parent.Name).Select
    
    With ThisWorkbook.Sheets(1)
        .Cells(3, 3) = Target.Parent.Name
        .Cells(3, 4) = Target.Address
        .Cells(3, 5) = FilePath
    End With
    
    MsgBox "完了しました"
    
End Sub

' シート選択ダイアログを表示
' 戻り値:選択されたシートオブジェクト
Public Function ShowSelectSheetDialog() As Worksheet

    Dim ShBackup As Worksheet
    Application.ScreenUpdating = False
    Set ShBackup = ActiveSheet
    With CommandBars.Add(Temporary:=True)
        .Controls.Add(ID:=957).Execute
        .Delete
    End With
    
    Set ShowSelectSheetDialog = ActiveSheet
    
    ShBackup.Select
    Application.ScreenUpdating = True

End Function

自分で試したこと

ステップインで1行ずつ実行したところ、参照範囲を選択する過程では問題なくコピーされリンク貼付けができる状態でしたが、

    On Error Resume Next
        Set Target = Application.InputBox("貼付け範囲を選択してください", Type:=8)
    On Error GoTo 0

貼付け範囲を選択する過程のここの処理で、貼付け範囲を選択した後にリンク貼付けが選択できなくなってしまいました。

0

2Answer

自分の環境で上のマクロを実行してみましたが、問題なく動きました。
手順は以下の通り

1.ファイルを開くダイアログでExcelファイルを選ぶ
2.シートを選ぶ
3."貼付け範囲"を入力 例えば D5:J13
4.ファイルを開くダイアログで 「キャンセル」

ですが、「可視セルのみをリンク貼付けする処理」の参考には程遠い気がしました。

0

Comments

  1. @koook

    Questioner

    ありがとうございます。改めて考えてみると、実現したい処理は上記のマクロのアプローチでは不可能だと気づきました。

上記のマクロだと可視セルのみを選択しているため、個々のセルを複数選択している形になることから、単純なコピー・ペーストはできないことに気づきました。参照元のセルを1つコピーして貼付け先の対応するセルに貼付けするという処理を繰り返していく処理だとできるのかな、とは思いましたが。。ひとまず、質問はクローズいたします。皆様ありがとうございます。

0

Comments

  1. 可視セルのみをリンク貼付けする処理

    Aブックaシートの可視セルを、Bブックbシートに「リンク貼付け」するということでしょうか?

    ・「可視セル」だけの条件だと、空白セルも含まれ 相当なセル数になると思います。
    ・「リンク貼付け」するbシートのセル位置は、aシートの該当セル位置と同じですか。

    パッと思いつく疑問です。
    もし、次に質問をあげるなら、この辺の要件/条件を書いてもらえるといいかと思います。

Your answer might help someone💌