2017-01-23 4 views
1

特定の行のセルの内容をクリップボードにコピーする1つのボタンを1つの行にまとめたいとします。Excel/VBA:特定のセルの内容をクリップボードにコピーするボタンを作成します。

この例では、列Bのボタンを押すと、同じ行番号と列Eのセルの内容をコピーする必要があります。

私はExcelでマクロを使用したことはありませんが、私はここに必要なのでしょうか?

A | B | C | D | E  | 
1| |[BTN]| | |'foo' | 
2| |[BTN]| | |'bar' | 
3| |[BTN]| | |'foobar'| 
4| |[BTN]| | |  | 
5| |[BTN]| | |  | 

答えて

3

これは(COL b)において、各セルにボタンを追加すると同じ行の列Eからコンテンツをコピーするように設定されたアクション:

ここにボタンを作成する:

Sub Add_Buttons() 
Dim wS As Worksheet 
Dim LastRow As Long 
Dim i As Long 
Dim RgBtn As Range 
Dim Btn As Shape 

Set wS = ThisWorkbook.Sheets("Sheet1") 
LastRow = wS.Range("E" & wS.Rows.Count).End(xlUp).Row 

For i = 2 To LastRow 
    Set RgBtn = wS.Cells(i, 2) 
    Set Btn = wS.Shapes.AddFormControl(xlButtonControl, _ 
         RgBtn.Left, RgBtn.Top, RgBtn.Width, RgBtn.Height) 

    With Btn 
     .OnAction = "'CopyColE " & i & "'" 
     .OLEFormat.Object.Text = "Copy test " & i 
    End With 
Next i 
End Sub 

、クリップボードにCOL Eの内容を置くためのコード:

Public Sub CopyColE(ByVal RowIndex As Long) 
    Dim wS As Worksheet 
    Set wS = ThisWorkbook.Sheets("Sheet1") 

    Call CopyText(wS.Range("E" & RowIndex).Value) 
End Sub 

Public Sub CopyText(Text As String) 
    Dim MSForms_DataObject As Object 
    Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") 
    MSForms_DataObject.SetText Text 
    MSForms_DataObject.PutInClipboard 
    Set MSForms_DataObject = Nothing 
End Sub 

そして、以前に作成したすべてのボタンを削除するための手順

Sub Delete_All_Buttons() 
Dim wS As Worksheet 
Dim Btn As Shape 

Set wS = ThisWorkbook.Sheets("Sheet1") 

For Each Btn In wS.Shapes 
    Btn.Delete 
Next Btn 

End Sub 
(新しいボタンを生成する前に使用するように!)

Sheetをパラメータとして渡す方法が見つかりませんでしたので、今度は2回定義する必要があります(Add_ButtonsCopyColE

+0

偉大なもの!それを試してみる。しかし、ボタンをB列に置くとはどこですか? 'LastRow'の割り当てで? thx – tzippy

+0

'wS.Cells(i、2)'それは '2';)私はちょうどawesomely新しい編集でテストしました^^ – R3uK

+0

ああ私は見る! :)なぜ私は2で始まるのですか?もう1つの答えでは、ボタンは2行目から始まります。なぜでしょうか? – tzippy

3

あなたは動的WorksheetにボタンShapeを追加し、セル寸法にそれをフィットし、さらにそのボタンにアクションを追加することができます。ボタンを作成するときには、それに適合するRangeのアドレスを持つボタンにAlternativeTextを追加することができます。その後、ボタン 'アクション'ルーチンでは、Rangeのアドレスを取得して、その行のセル値をクリップボードにコピーするなど、ボタンの行のセル値を操作できるようになります。

サンプルコード:

Option Explicit 

Sub CreateButtons() 

    Dim ws As Worksheet 
    Dim lngRow As Long 
    Dim rngButton As Range 
    Dim shpButton As Shape 

    Set ws = ThisWorkbook.Worksheets("Sheet1") 
    'ws.Cells.Delete 

    'create a sequence of buttons 
    For lngRow = 2 To 11 
     'get a range 
     Set rngButton = ws.Cells(lngRow, 2) 

     'use range properties to define button boundaries 
     Set shpButton = ws.Shapes.AddFormControl(xlButtonControl, _ 
      rngButton.Left, _ 
      rngButton.Top, _ 
      rngButton.Width, _ 
      rngButton.Height) 

     'add button properties - action, caption and alt text 
     With shpButton 
      .OnAction = "DoButtonAction" 
      .OLEFormat.Object.Text = "Foo" & lngRow 
      ' store the cell address here 
      .AlternativeText = rngButton.Address 
     End With 

     'add a value to column D to use later 
     ws.Cells(lngRow, 4).Value = lngRow 

    Next lngRow 

End Sub 

Sub DoButtonAction() 

    Dim shp As Shape 
    Dim strControlName As String 
    Dim strAddress As String 
    Dim rngButton As Range 

    'get button name 
    strControlName = Application.Caller 

    'get alternative text which has cell address 
    strAddress = ActiveSheet.Shapes(strControlName).AlternativeText 

    'get range corresponding to button and do stuff with cells in that row 
    Set rngButton = ActiveSheet.Range(strAddress) 

    'set a cell value on row of button 
    rngButton.Offset(0, 3).Value = rngButton.Offset(0, 2).Value + 1 

    'copy cell value for use later 
    rngButton.Offset(0, 2).Copy 

End Sub 

スクリーンセルにおいてD9値がクリップボードにコピーされた:

enter image description here

関連する問題