2016-06-20 16 views
0

私はクライアントデータを含むスプレッドシートを持っています。行ごとに1つのクライアントがあり、各行にはそのクライアントのデータを示すuserformを起動するボタンがあります。そのクライアントの行に書き戻します。スプレッドシートの使用を開始する前に、各ケースのワーカーがフィルタリングして、クライアントのみが表示されるようにします。excel vbaの複数のボタンに1つのsubを使用

私は、各行のボタンに1つのコマンドボタンプロシージャを持たせる方法があるかどうかを考えました。つまり、6行目のボタンを押すと、その行のデータを呼び出すCommandButton6のプロシージャを実行します。 8行目のCommandButton8のプロシージャを実行して、8行目のデータを呼び出します。ただし、両方のプロシージャは同じであるため、行番号でCommandButtoniサブを使用できます。

これは非常に簡単な手順ですが、350回コピーする必要はありません。

Private Sub CommandButton1_Click() 

UserForm1.TextBox1.Value = Worksheets("Sheet1").Range("C2").Value 
GetData 

UserForm1.Show 

End Sub 
+5

有り - 、フォームボタン、しないのActiveXを使用するのすべてに同じマクロを割り当て、行番号を取得するために 'Activesheet.Buttons(Application.Caller).TopleftCell.Row'を指します。 – Rory

答えて

0

あなたはVBAで持つことができないパラメータ化Clickハンドラを、必要があるでしょう。あなたは350のフォームボタンを同じハンドラプロシージャに割り当てることができますが、UserForm1.TextBox1.Valueは何でもWorksheets("Sheet1").Range("C2").Valueに割り当て、は実際にの "行パラメータ"を持つように思えます。

ワークシートに350個のフォーム/ ActiveXボタンを配置することは、一般的にはあまり良い考えではありません。代わりに別のアプローチを考えようとします。

Selectionは、ボタンをクリックしたときに必要な行ですか?あなたは(SelectionChangedワークシートのイベントを処理)何とか現在の/アクティブな行のハイライトを作り、そしてどこかのボタンを持っている可能性がSelectionをオフ動作する(リボンで?):

それ以外は
UserForm1.TextBox1.Value = Sheet1.Range("C" & Selection.Row).Value 

Rory's suggestionが働くだろう...しかし、フォームボタンはこのように使うつもりはありませんでした。

+1

私は350ボタンが悪い考えであることに同意します。ただし、すべてのボタンクリックをフックしてサブルーチンを呼び出すWithEventsフォームボタンクラスを作成することはできます。ここにJohn Walkenbachの投稿があります:http://spreadsheetpage.com/index.php/tip/handle_multiple_userform_buttons_with_one_subroutine/そして、ここに私が書いた狂ったものがあります:http://yoursumbuddy.com/userform-event-handler-class-multiple-controls/。両方とも実際のフォームのフォームコントロールに適用されますが、同じ考えをワークシートで使用することもできます。また、私はあなたに同意します。リボンまたは右クリックのコントロールを追加するには、RibbonXを使用します。 –

1

ロリーの提案を実装した後、私はそれが最もシンプルで最もエレガントなコードソリューションだと思います。コードを一律に実行すると、これ以上設定を行わずにボタンをコピーして貼り付けることができます。

  1. にカスタマイズクイックアクセスツールバーのドロップダウンメニューをクリックしてください:あなたがしたい/していない場合は

    Sub AddVote() 
    
    ' This is a simple vote tally counter. Each time a button is clicked, 
    ' the vote count in the third column is incremented by one. 
    ' Imagine: first column = candidate name; second column holds form button; 
    ' Thid column = vote count 
    ' Create a Form button and assign this macro. Copy and paste button! 
    
    Dim rngTally As Range 
    
    ' Use rngTally to point to the cell in the third column (3, in the formula) 
    ' in the same row as the top left corner of the button. 
    Set rngTally = Cells(ActiveSheet.Buttons(Application.Caller).TopLeftCell.Row, 3) 
    
    ' Increment the value of the cell pointed to by rngTally by 1 
    rngTally = rngTally + 1 
    
    End Sub 
    

    は、カスタムユーザーフォームを設計する必要があり、あなたは、フォーム...コマンドを使用することができますExcel タイトルバー。

  2. [その他のコマンド]を選択します。
  3. ドキュメントを他のユーザーに配布する場合は、「すべてのドキュメント(デフォルト)」オプションをドキュメント名に変更します。
  4. から選択するコマンドから選択します。コマンドリボンにはありません。
  5. [フォーム...]コマンドを選択します。
  6. [追加]をクリックして、右側のメニューにボタンを追加します。
  7. [OK]をクリックします。

テーブル内の任意のセルを選択して、[フォーム]ボタンをクリックします。編集してEnterを押します。また、条件を使用して値をフィルタリングすることもできます。残念なことにフォームを編集する方法はありませんが、細いセルの内容には便利です。コーディングは必要ありません。

https://support.office.com/en-us/article/Add-edit-find-and-delete-rows-by-using-a-data-form-9443c80d-66c6-4c17-b844-64aac5ae841d

関連する問題