Excel VBAでシートのコピー時にコンボボックスもコピーしたい

このQ&Aのポイント
  • Excel VBAを使用して、シートのコピー時にコンボボックスも一緒にコピーする方法を知りたいです。シートに配置したボタンとコンボボックスを含めた全ての要素を別のシートにコピーしたいです。
  • コピー元のシートで作成したコンボボックスがコピー先のシートにも一緒にコピーされないため、再度コンボボックスを設定する必要があります。シートをコピーする際にコンボボックスも一緒にコピーする方法について教えてください。
  • Excel VBAを使って、コンボボックスが設定されたシートを別のシートにコピーしたいです。コンボボックスの内容がコピー先のシートにも反映されるようにする方法を教えてください。
回答を見る
  • ベストアンサー

Excel VBA シートのコピー時に、シート上のコンボボックスもコピーしたい。

こんにちは。 Excel VBAについて質問させていただきます。 やりたいことは、 シートAにボタンとコンボボックスを配置し、 コンボボックスには氏名の一覧を設定しています。 そこで、ボタンを押すとシートAをボタンとコンボボックスごと シートBという名前でコピーをしたいと思っています。 ActiveSheet.Copy Before:=Worksheets(1) でシート・ボタン・コンボボックスのコピーはうまく出来たのですが、 コンボボックスに設定していた氏名の一覧はコピーされていませんでした。 コピー先のシートのコンボボックスにもう一度氏名の一覧を 設定するしかないのでしょうか? それともシートのコピー時に何かいい方法があるのでしょうか。 宜しければアドバイスをお願い致します。 OSはWindows2000Pro Excelは2000です

  • to-na
  • お礼率95% (106/111)

質問者が選んだベストアンサー

  • ベストアンサー
  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.2

こんばんは。再度の登場です。 先の回答は、ListFillRangeプロパティを使用したものですのでコピーしても値は保持されますが、 質問者のように、AddItemメソッドでセットしたものはコピーしても保持されませんので改めてセットする必要があります。 現在”コンボボックスの中身もコピー”されてるようですが、 その中身のコピーを実行するタイミングを誤ると上手くいかない場合があります。 シートのコピーと同時に”中身のコピー”をするとそれは一見上手くいってるようでも ブックを閉じて再度開いたときにはクリアーされますので、 コピーしてできたシートがActiveになるたびにそのシートのComboboxにも値をセットしなければいけません。 WorkBookOpenイベントでセットしているのは「元のComboboxにのみ」Listをセットしているわけですから。 ●要約● 以下、コピーされてできた新しいシートは、見積書2、とする (方法1) 「見積書2」がアクティブになる度に「見積書」のComoboxのListをコピーする (方法2) WorkbookのOpenイベントの”Function SetComboBox()”を標準モジュールへ移し、 「見積書」「見積書2」それぞれのActivateイベントで、”Function SetComboBox()”を呼び出す その場合、”Function SetComboBox()”のComboboxのコンテナである固有のシート名は使わずに、ActiveSheetに変更しておく (方法3) WorkBookのOpenイベントでは、リスト一覧を配列変数に作成しておき 「見積書」「見積書2」がActiveになったときそのシート上のComboBoxのListに配列変数をセットする   ●もし興味があれば、配列変数をListプロパティに直接セットするコードをアップしてもいいのですが。。。   それから、敬称Comboのリストは決まっているようですから、 別なシートのどこかのセルに一覧を作っておき、 ListFillRangeプロパティにセットしておけばいいですね。 以上です。  

その他の回答 (2)

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

おはようございます。 追加です。 (方法4) 敬称Comboだけではなく、顧客ComboもListFillRangeを使う方法もありますね。 別シートに、敬称リスト、顧客リストを作成しそれを利用するわけですが、 敬称は予めセットしておけばいいでしょうから、顧客Comboのみの説明にします。 以下、別シートを「一覧シート」と呼びます。 "Function SetComboBox"で、「顧客名」シートから「一覧シート」に、必要な値を作成し、 顧客Combo.ListFillRange = "一覧シート!A1:B" & 「一覧シート」の最終行 としておけばコピーしても引き継がれます。   ●コードの他の部分をみてないので何なんですがちょと思ったこと 現在はWorkBookイベントでComboへリストをセットしているみたいですが 色々な処理の途中で「顧客マスタ」の修正削除追加はないのでしょうか そういったことは普通ありそうに思えますが、 いまのままではその変更は顧客Comboにリアルタイムには反映されませんよね。 今朝は暇なのでだらだらと余計なことを書いてしまいました。(^^;;; 以上です。  

to-na
質問者

お礼

すごくお礼が遅れてしまって申し訳ありませんでした。 教えていただいた方法で解決できました☆ Comboへの顧客マスタの反映はブックを開く時に 全てのシートに対して行なうようにしてみました。 顧客マスタへの反映は、、、やりたかったですけど、 とりあえずは参照だけにしておきました。 きちんと一通りのマスタ等を作ろうと思ったら、 Accessの方がいいのかなぁと思いまして。 今回はExcelのVBAがどんなものかを知りたくて作ってみましたから。 次はAccessで画面を作ってやってみたいなぁと思っています。 とても丁寧に何度も書き込んで頂いたのに、 お返事が遅くなって本当に申し訳ありませんでした。 またもし別の質問を見つけられたときは、 どうぞ宜しくお願いします。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.1

こんにちは。 >コンボボックスに設定していた氏名の一覧はコピーされていませんでした その方が不思議な現象です。(^^;;; 一覧の設定はどうしたやりましたか。 一覧のあるシートなど実際のシート名、その方法をアップしてください。 そのボタン、コンボボックスは、フォームツールバーからのものでしょうか、 あるいは、コントロールツールボックスからのものでしょうか。 またそれらのコードはどこにおいてますか、標準モジュール、シートモジュールなど 情報は多いほうがいいですので上記補足してください。 以上です。

to-na
質問者

補足

お返事ありがとうございます。 補足が遅れて申し訳ありませんでした。 (1)一覧の設定は「ThisWorkBook内のオープンイベント」で  「同じThisWorkBook内の下記のSetComboBox関数」を呼び出して  AddItemのListで設定しています。  設定するデータの元はブック内の別のシートからです。 (2)ボタン等はコントロールツールボックスから貼り付けました。 (3)無理やりコピー前のシートから一覧もコピーするようにしましたが、  シートのコピーだけで出来ないのかと思いまして。。 'コンボボックスの中身もコピー ActiveSheet.cboCliantName.List = Sheets(strSaveSheetName).cboCliantName.List '顧客名 Private Function SetComboBox() Dim intI As Integer 'ループカウンタ Dim objSheet As Worksheet 'ワークシートオブジェクト Dim strRange As String 'セル範囲 Dim intSetPos As Integer 'コンボボックスのセット位置 SetComboBox = False For Each objSheet In Worksheets '「見積書」のシートであれば設定 If InStr(1, objSheet.name, SHEET_NAME_MITSUMORI) > 0 And IsNull(InStr(1, objSheet.name, SHEET_NAME_MITSUMORI)) = False Then With Sheets(objSheet.name) '----------------------------- '顧客名称コンボボックスの設定 '----------------------------- .cboCliantName.ColumnCount = 2 'カラム数 ' .cboCliantName.ColumnWidths = "100;500" 'カラム幅 .cboCliantName.TextColumn = 2 '表示させるカラム .cboCliantName.Style = fmStyleDropDownCombo '顧客名コンボボックスの参照元範囲設定をクリア .cboCliantName.ListFillRange = "" '----最上段には空欄をセット---- .cboCliantName.AddItem '顧客番号をセット .cboCliantName.List(0, 0) = "" '顧客名称をセット .cboCliantName.List(0, 1) = "" intSetPos = 1 For intI = 0 To CRIANT_MAX_REC_CNT - 1 '顧客番号が空欄でなければ、コンボボックスに追加 strRange = "A" & Trim(CStr(4 + intI)) If Sheets(CLIENT_SETTING_SHEET_NAME).Range(strRange).Value <> "" Then .cboCliantName.AddItem '顧客番号をセット .cboCliantName.List(intSetPos, 0) = Sheets(CLIENT_SETTING_SHEET_NAME).Range(strRange).Value strRange = "B" & Trim(CStr(4 + intI)) '顧客名称をセット .cboCliantName.List(intSetPos, 1) = Sheets(CLIENT_SETTING_SHEET_NAME).Range(strRange).Value intSetPos = intSetPos + 1 End If Next intI '----------------------------- '敬称コンボボックスの設定 '----------------------------- .cboKeisyou.ColumnCount = 1 .cboKeisyou.Style = fmStyleDropDownCombo .cboKeisyou.AddItem "殿" .cboKeisyou.AddItem "様" .cboKeisyou.AddItem "御中" End With End If Next SetComboBox = True End Function

関連するQ&A

  • Excelのワークシート上でコンボボックス

    お世話になります。 Excelのワークシート上にコンボボックスを配置して、ここからマクロを選択して呼び出すことは出来ますか? コンボボックスは配置できるのですが、マクロ名を設定する方法がわかりません。 エクセルのヴァージョンはExcell2000です。 よろしくお願いいたします。

  • シート上のコンボボックスの使い方

    シート上のコンボボックスの使い方 現在作っている物があるのですが、色々と調べてはみるものの解決出来なくて困っています。 ☆やりたいこと シート1 コンボボックスA コンボボックスB コンボボックスC 一覧表(A1~A16)の枠だけが書かれているもの コンボボックスA・・・青森 秋田 岩手 コンボボックスB・・・100 200 300 コンボボックスC・・・北 東 西 南 シート2 コンボボックスAとBとCの選択されたものによって選ばれる一覧表(例A1~E16)のデータ ☆シート1にてコンボボックスを3種類選択した時に、シート1枠だけの一覧表にシート2のデータが表示される! ということがやりたいです。 説明がアバウトすぎて申し訳ありませんが、初心者なりに色々やった結果が惨敗に終わっている状態です。 皆様のお力を貸していただきたく思います。

  • EXCEL VBA シートのコピー後処理?

    EXCEL2013使用にてフォーム内ボタンより 下記、受注一覧表シートをコピー→一番左に配置して 処理シートに名前を変更して J列基準の昇順に並び変えようとしていますが ActiveSheet.Name = "処理シート"で コードの実行が中断されましたメッセージが出ます。 ActiveSheet.Name = "処理シート"にブレークポイントを置いて F8で進めていきますと処理実行します。 ユーザーフォームは UserForm1.Show 0で開いております。 どの箇所の修正を行えばいいのか ご教示時お願いいたします。 Private Sub CommandButton1_Click() Worksheets("受注一覧表").Copy Before:=Worksheets(1) ActiveSheet.Name = "処理シート" Worksheets("処理シート").Select Rows("8:2328").Select Range("B8").Activate ActiveWorkbook.Worksheets("処理シート").Sort.SortFields.Clear ActiveWorkbook.Worksheets("処理シート").Sort.SortFields.Add Key:=Range("J9:J2328") _ , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("処理シート").Sort .SetRange Range("B8:L2328") .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("B8").Select End Sub

  • エクセルでシートのコピー

    いつもお世話になっています、マクロ初心者です。 カレンダーの1月分をシートごと12月までコピーするのに、サンプル集をそのまま引用したのですが、シート名を指定する所でエラーになってしまいます。 $"月"の部分を削除すればうまくいきます。 エクセル2000パーソナルだからなのでしょうか? 'シートコピー Worksheets(1).Cells.Copy For i = 2 To 12 Worksheets.Add after:=Worksheets(ActiveSheet.Index) ActiveSheet.Name = CStr(i) & "月"(この行がエラーになります) ActiveSheet.Paste Range("A1").Select Next i エクセル2000パーソナルで処理する方法がありましたら教えてください。

  • コンボボックスから検索するVBA(エクセル)

    sheet1にメニュー画面 sheet2に一覧表を作成しました。 (1)sheet1でユーザーフォームを起動させる。 (2)ユーザーフォームにはコンボボックスを1つ、コマンドボタンを2個配置しました  (3)コンボボックスのプルダウンメニューはsheet2の一覧表より取得しました (4)sheet2の一覧表は今後データが増えていきます(データは4行目以降) という条件で以下のコードを作成しました。 (1)と(2)のコマンドボタンは正常に作動しています。 コンボボックスのコードのみ書いています。 Private Sub UserForm_Initialize() Dim i As Long With Worksheets("sheet2") For i = 4 To .Cells(Rows.Count, 3).End(xlUp).Row ComboBox1.AddItem Cells(i, 3).Value Next i End With End Sub このときプルダウンメニューを押しても空欄が表示されてしまいます。 できない理由が分かりません。よろしくお願いします。 また、Private Sub ComboBox1_Change()とは何が違うのでしょうか? 最近 VBAを始めた初心者です。よろしくお願いします。

  • エクセルのシートにコンボボックスを配置しようとしています。

    エクセルのシートにコンボボックスを配置しようとしています。 コントロールツールボックスのコンボボックスは、見た目があまりよくないところが 気になります。 ドロップダウンのボタンのデザインが角ばってることや シートのフォントと同一のフォントに設定してもちょっと違う(なぜ?)とこなど、 気にいりません。 フォームのコントロールは名前が変更できず、VBの関数がドロップ1_Change()などとなるため、 後に管理しづらそうで心配しています。 コントロールツールボックスのコンボボックスの見た目を改善する方法、または、 フォームのコントロールの名前を変更する方法がありましたら、 教えてください!!

  • vbsでExcelのシートをコピーするには

    vbsでExcelのシートをコピーすることができず、困っています。 雛形のAファイル(Excel)のシートを別のBファイル(Excel)にコピーしたいのですが、 下記コーディングでは、「実行時エラー この変数は宣言されていません。: 'before'」となります。 xlsSheet.Copy before:=xlsBook2.Worksheets("Sheet1") Excelのマクロに記載して、Excelのコマンドボタンから呼び出すなどすれば動くのですが、 ハンディ端末のサーバ側アプリがvbsで、vbsから行いたいのです。 vbsでExcelファイルのシートをコピーすることはできないのでしょうか。 ご存知の方、ご教授いただければ幸いです。

  • エクセルVBAでコンボボックス

    エクセルVBAのコンボボックスの使い方について質問します。 実現したいプログラムは 「チェックボックスから選んだ数字で計算するプログラム」 です。 具体的には… まず、コンボボックスをシート上に配置します。そのコンボボックスには 数字の1から10を選べるようにしておきます。 次に、コマンドボタンを配置します。これは単にプログラムをスタート させる目的です。 ユーザーは、まずコンボボックスから好きな数字を選択します。 そしてスタートボタン(コマンドボタン)を押します。 すると、選んだ数字の2倍がセルに表示されます。 さらに発展系としては… チェックボックスを4つ配置します。各チェックボックス には、+、-、×、÷を割り振っておきます。 また、コンボボックスを2つ用意し、それぞれ1~10の数字をリストにします。 ユーザーは、チェックボックスから好きな記号を選び、さらにコンボボックスから 好きな数字を選びます。そしてスタートボタンを押すと、選んだ数字を選んだ記号 で計算した値がセルに表示されます。 というようなプログラムを考えているのですが、うまくできません。 ポイントは、 ・チェックボックスにリストを入力する方法 ・チェックボックスの選択状態や、リストボックスから選ばれた数字を、  変数として取得する方法 インターネットで調べているのですが、リストボックスに値を入れるのにもマクロを走らせ なければならない方法とか、ユーザーフォームでの説明ばかりでなかなか実現に至りません。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_userform05.html プログラムのイメージ図としては添付の図の通りです。 どのようにプログラムを書けばいいのでしょうか。

  • エクセル VBA シートのコピーが上手く出来ない

    原因が分かりません。宜しくお願いします。 エクセルVBAで、フィルターを掛けたシートを別シートへコピーしています。 問題なく出来ていたルーチンでしたが、他の作業の影響か、 気がついたらコピー出来なくなっていました。 他のシートでも同じ方法でコピーを行っていますが、問題ありません。 問題のコーディングは以下のとおりです。 Worksheets("work2").Unprotect Worksheets("work2").Range("A:Z").ClearContents Worksheets("コピー元").Range("A5").AutoFilter Field:=6, Criteria1:=フィルタ請求年1, Operator:=xlOr, Criteria2:=フィルタ請求年2, VISIBLEDROPDOWN:=True Worksheets("コピー元").Range("A1").CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("work2").Range("A1") Worksheets("work2").Protect Worksheets("コピー元").Range("A1").CurrentRegion.SpecialCells(xlVisible).Copy Worksheets("work2").Range("A1") の箇所では、エラーメッセージもでませんが、コピーもされていないことを確認しています。 どのような原因が考えられるでしょうか? または、どのような方法で原因追求が出来るでしょうか? ご回答お待ちしています。

  • 【VBA】シートのコピー ~ 値に直す

    大変お世話になります。 VBAのコードについてご教示いただけませんでしょうか。 ■やりたいこと -------------------------------------------------------------------------------- (1) 【原紙】Sheetを、同ブック内の新規シートへコピー (2) 新規シートのシート名を、[セル:B5]の値に変更 (3) 新規シートにコピーされてきた数式を値に変更 ■作成してみたコード -------------------------------------------------------------------------------- Sub SheetCopy1() Worksheets("【原紙】Sheet").Copy Before:=Worksheets("【原紙】Sheet") ActiveSheet.Name = Range("B5").Value Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues Application.CutCopyMode = False End Sub -------------------------------------------------------------------------------- 本日初めてVBAに触れた者が、見よう見まねで『■やりたいこと』を並べたコードのため、やはりエラーになってしまいます。 上記は、どこをどう直せばよろしいでしょうか。 もしくは、そもそも間違っておりますでしょうか。 ご教示いただきたく、何卒よろしくお願いいたします。 ◎もし可能でしたら、併せてご教示ください◎ ---------------------------------------------------------------------------- (1)の動作をさせるために、【原紙】Sheetの任意の場所に”ボタン”を設置するのですが、新規シートにもコピーされるため、そのコピー側のボタンを削除できたら…とも考えていますが、そういう動作も可能でしょうか。

専門家に質問してみよう