0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

飛び飛びセル順次コピペ

Last updated at Posted at 2020-11-08

昨日知ったApplication.InputBoxの延長でもう一つ作った。

概要

  • 飛び飛びのセルを複数選択コピーする機能は、コピー側は可能だがペースト側が不可能なため後者を可能にする。
  • 使い方:最初のInputBoxで複数セルを順次コピーして、次のInputBoxで順次選択したセルにペーストする。
  • 複数選択、範囲選択可能。

残課題

@jinojiさんのコメントで課題解決しました!!!
ありがとうございます!!!

  • 複数選択数がコピー/ペーストで異なる場合、小さい方に合わせて出力され、余剰範囲に#N/Aが出力される。
  • 範囲サイズがコピー/ペーストで異なる場合、小さい方に合わせて出力され、余剰範囲に#N/Aが出力される。

コード

Option Explicit
'適宜変更してください
  Const 待ち時間 = 300 'ミリ秒
  Const 分母 = 86400000 '待ち時間のミリ秒変換分母
  Dim CB()
    
Sub 飛び飛びセル順次コピペ()
  If 順次コピー = True Then
    Call 順次ペースト
  End If
End Sub

Private Function 順次コピー() As Boolean
  'InputBox用の説明文
    Dim Cmt(1)
    Cmt(0) = "セルを選択してください。"
    Cmt(1) = "(Ctrlで複数選択可能。ドラッグで範囲選択可能)"
    Dim Prompt: Prompt = Join(Cmt, vbCrLf)
    Const Title = "順次セル選択:コピー"
  
  'メイン
    On Error GoTo エラー処理
    Dim rng As Range
    Set rng = Application.InputBox(Prompt, Title, Type:=8)
    rng.Select
  
    ReDim CB(rng.Cells.Count - 1)
    Dim c As Range, i As Long
    For Each c In rng.Cells
        CB(i) = c.Value
        i = i + 1
    Next
  
  順次コピー = True
Exit Function

エラー処理:
  Select Case Err.Number
    Case 424
      Err.Clear
    Case Else
      MsgBox Err.Number & Err.Description
  End Select
  順次コピー = False
End Function


Private Sub 順次ペースト()
  'InputBox用の説明文
    Dim Cmt(1)
    Cmt(0) = "セルを選択してください。"
    Cmt(1) = "(Ctrlで複数選択可能。ドラッグで範囲選択可能)"
    Dim Prompt: Prompt = Join(Cmt, vbCrLf)
    Const Title = "順次セル選択:ペースト"
  
  'メイン
    On Error GoTo エラー処理
    Dim rng As Range
    Set rng = Application.InputBox(Prompt, Title, Type:=8)
    rng.Select
  
    Dim ub, c As Range, i As Long
    ub = UBound(CB)
    For Each c In rng.Cells
        c.Value = CB(i)
        i = i + 1
        If i > ub Then Exit For
    Next
  
Exit Sub

エラー処理:
  Select Case Err.Number
    Case 424
      Err.Clear
    Case Else
      MsgBox Err.Number & Err.Description
  End Select
End Sub

コード(旧)

↓改善前↓
Option Explicit
'ここを変えければ変える
  Const 待ち時間 = 300 'ミリ秒
  Const 分母 = 86400000 '待ち時間のミリ秒変換分母
  Dim CB()
    
Sub 飛び飛びセル順次コピペ()
  If 順次コピー = True Then
    Call 順次ペースト
  End If
End Sub

Private Function 順次コピー() As Boolean
  'InputBox用の説明文
    Dim Cmt(1)
    Cmt(0) = "セルを選択してください。"
    Cmt(1) = "(Ctrlで複数選択可能。ドラッグで範囲選択可能)"
    Dim Prompt: Prompt = Join(Cmt, vbCrLf)
    Const Title = "順次セル選択:コピー"
  
  'メイン
    On Error GoTo エラー処理
    Dim rng As Range
    Set rng = Application.InputBox(Prompt, Title, Type:=8)
    rng.Select
  
    Dim Target: Target = Split(rng.Address, ",")
    Dim i As Long
    For i = 0 To UBound(Target)
      ReDim Preserve CB(i)
      CB(i) = Range(Target(i)).Value
    Next
  
  順次コピー = True
Exit Function

エラー処理:
  Select Case Err.Number
    Case 424
      Err.Clear
    Case Else
      MsgBox Err.Number & Err.Description
  End Select
  順次コピー = False
End Function


Private Sub 順次ペースト()
  'InputBox用の説明文
    Dim Cmt(1)
    Cmt(0) = "セルを選択してください。"
    Cmt(1) = "(Ctrlで複数選択可能。ドラッグで範囲選択可能)"
    Dim Prompt: Prompt = Join(Cmt, vbCrLf)
    Const Title = "順次セル選択:ペースト"
  
  'メイン
    On Error GoTo エラー処理
    Dim rng As Range
    Set rng = Application.InputBox(Prompt, Title, Type:=8)
    rng.Select
  
    Dim Target: Target = Split(rng.Address, ",")
    Dim i As Long
    For i = 0 To UBound(Target)
      Range(Target(i)).Value = CB(i)
    Next
  
Exit Sub

エラー処理:
  Select Case Err.Number
    Case 9
      MsgBox "ペースト数がコピー数が一致しませんでした。少ない方で出力しました。"
    Case 424
      Err.Clear
    Case Else
      MsgBox Err.Number & Err.Description
  End Select
End Sub


0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?