VBAでサーバー上の別ブックを参照してコンボボックスにデータを表示する方法

このQ&Aのポイント
  • VBAを使用して、エクセルのコンボボックスにサーバー上の別ブックに存在するデータを表示する方法について教えてください。
  • 具体的には、エクセルのユーザーフォーム内のコンボボックスに、サーバー上のデータベースファイルのA3から最終行までのデータを取得して表示したいです。
  • マクロを使用してコンボボックスにデータを表示する方法を教えてください。
回答を見る
  • ベストアンサー

VBA コンボBOXでサーバー上の別ブックを参照

皆さんこんにちは。 エクセル2013使用をしております。 現在Book1.xlsxのユーザーフォーム内にある コンボBOX1にサーバー上に存在するデータベース.xlsxの A3~A最終行を参照してコントロールにしようと マクロを作成中です。 本やネットを参考に ”サーバー上に存在するデータベース.xlsxの『A3:A100』をコントロールにする” まで作成したのですが 『A最終行』Range("a1048576").End(xlUp).Offset(1).Selectを どのように記載すれば良いか分かりません。 サーバー上の別ブックを参照し 重複しないようコンボBOXのコントロールを作成したいのです。 ご教授いただけないでしょうか。 Private Sub UserForm_Initialize() Dim myFormula As String Dim rowCount As Long Dim i As Long, j As Long Dim Ar() As Variant Const myPath As String = "'\\***.**.**.**\data\[データベース.xlsx]Sheet1'!$A$3:$A$100" myFormula = Application.ConvertFormula(myPath, xlA1, xlR1C1, xlAbsolute) rowCount = Application.ExecuteExcel4Macro("ROWS(" & myFormula & ")") ReDim Ar(rowCount - 1) For i = 1 To rowCount Ar(j) = Application.ExecuteExcel4Macro("INDEX(" & myFormula & "," & i & ",0 )") j = j + 1 Next ComboBox1.List = Ar End Sub

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

  • ベストアンサー
回答No.1

こんにちは。 ExecuteExcel4Macroを使う方法で、一旦は解答書いてみたのですが、 最終行を取得する方法が難しくて、考えても解らなかったので、 代替え案で動く様には出来たものの、 結果的に記述が冗長(下に示すものより厚量)になり、 また、レコード数を増やすほど動作が重くなるようなので、 ExecuteExcel4Macro以外の他の方法を提案しようと考えることにしました。 > サーバー上の別ブックを参照し > 重複しないようコンボBOXのコントロールを作成したいのです。 Win7 x64 / Excel2010 x64 で動作確認していますが、 今こちらは、スタンドアローンなので、 サーバー上のファイルでは試せていません。 もし、その点でうまくいかないようでしたら御容赦下さい。 「ブックを開かずにExcelテーブルを参照する方法」  → ADODB 「配列から重複を取り除く方法」  → Scripting.Dictionary このふたつが主役になりますが、 比較的簡単に書ける、比較的処理が速い、一般によく知られている、 という理由で選んでいます。 これらのオブジェクトを使う為に、VBAで[参照設定]を追加する必要があります。 [参照設定]をしないと、コンパイルエラーになります。 単列(ひとつのフィールド)のデータのみ取得する形で書いています。 複数列を取得する場合は、書き加える必要があります。 例えば、 Const myRef = "A3:C65536" のように3列で指定すると、そのままでも   mtx() = oRSet.GetRows の結果は、正しく3列分のデータが採れますが、 その後の処理に工夫が必要になります。 重複の削除については、   oRSet.Open "SELECT DISTINCT * FROM [" ... のように、SQLにちょこっと付け足すだけでも出来るのですが、 勝手にソートされちゃうのを避ける方法が見つからないので、 Dictionary オブジェクトを使う方法ことにました。 勝手に並べ替えされても構わないなら、もう少し簡単にできる、という、、、。 myPath に指定するのは、ブックのフルパスです。 クォートや角括弧を含めずに、普通に書いて指定して下さい。 以下が私の提案するスクリプトです。 ' ' /// ' ' ■(ADODB)参照設定■Microsoft ActiveX Data Objects x.x Library■ ... x.x=6.1? 最新版で ' ' ■(Scripting)参照設定■Microsoft Scripting Runtime■ Private Sub UserForm_Initialize() Const myPath = "\\***.**.**.**\data\データベース.xlsx" '  要指定◆ブックへのパス Const mySheet = "Sheet1" ' 要指定◆シート名 Const myRef = "A3:A65536" ' 要指定◆セル範囲/最下行は余分に指定しても処理に影響しない Const myProv = "Microsoft.ACE.OLEDB.12.0" ' 固定▼ 'Const myProv = "Microsoft.Jet.OLEDB.4.0" ' 固定▲環境によっては、上の行と差し替え   ' ' データソース(Excelブック)へのコネクション生成 Dim oConn As New ADODB.Connection   oConn.Open "Provider=" & myProv & _         ";Data Source=" & myPath & _         ";Extended Properties=""Excel 12.0;HDR=No;ReadOnly=True"""   ' ' レコードセット 取得 [Sheet1$A3:A65536] Dim oRSet As New ADODB.Recordset   oRSet.Open "SELECT * FROM [" & mySheet & "$" & myRef & "]", _         oConn, adOpenStatic, adLockOptimistic, adCmdText   ' ' レコード数 を取得 Dim rowCount As Long   rowCount = oRSet.RecordCount ' 方法を示す為だけの記述なので 未使用です   ' ' レコードセットすべて を 配列変数 に格納 Dim mtx()   mtx() = oRSet.GetRows ' ← 行列反転した配列   oRSet.Close: Set oRSet = Nothing: oConn.Close: Set oConn = Nothing ' ADODB オブジェクト の後始末   ' ' 重複削除 Dictionary オブジェクト Dim oDict As New Scripting.Dictionary Dim v   ' ' Dictionary オブジェクトに 重複しないキー を格納   For Each v In mtx()     oDict(v) = Empty   Next   Erase mtx() ' 配列変数初期化   ' ' コンボボックスの.List に Dictionary オブジェクトのキー配列 を渡す   ComboBox1.List = oDict.Keys()   oDict.RemoveAll: Set oDict = Nothing ' Dictionary オブジェクトの後始末 End Sub ' ' ///

harumama0430
質問者

お礼

realbeatinさん 夜遅くまで考えていただいたようで ありがたいやら申し訳ないやら・・・感謝の気持ちでいっぱいです。 ExecuteExcel4Macroにあとちょっと足したら やりたい事が出来るんじゃないか?という私の浅はかな考えで ご面倒をおかけした事お詫びいたします。 力技でデータベースをアクディブBookにコピペしてそれを参照した方が 簡単だったのかな、 最初から初心者が欲張り過ぎたかなと 猛烈に反省しております。 まさかこんな全然予想と違う形の回答をいただくとは・・・ realbeatinさんのご回答で希望の動作が出来ました。 度重なるご回答、本当にありがとうございます。

関連するQ&A

  • EXCELのVBAにて閉じたブックの数値を拾い出したいため

    EXCELのVBAにて閉じたブックの数値を拾い出したいため ExecuteExcel4Macroを使用して次のように作成しましたが 生産管理ブック内の直出荷シートしか参照できません。 その他シートの参照して数値を拾い出したいため シートのループ処理(シート数不規則)を例えばworksheet(1)~処理終了の名前がついた シートまで行いたいのですがどの様に直出荷部分を書き込めばいいかわかりません。 いい方法を教えていただけ無いでしょうか? (:と生産計画の間 エン[ がうまく表示できません) Dim i As Long, idx As Long Dim hi As Integer For hi = 10 To 252 If Cells(2, 3) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & 11 & "C" & hi) Then Exit For End If Next hi i = 7 For idx = 7 To 3000 For i = i To 300 If ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx & "C" & 5) = 0 Then Exit Sub End If Cells(i, 1) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx & "C" & 5) Cells(i, 2) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx + 2 & "C" & 5) Cells(i, 3) = ExecuteExcel4Macro("'E:\生産計画.xls]直出荷'!R" & idx + 11 & "C" & hi) i = i + 1 Exit For Next i idx = idx + 57 Next idx

  • VBAでブック名の拡張子を除去してシートにコピー

    VBA初心者でコード作成で困っております。 下記の通りコードを組みましたが、シート名をブック名に変更して 保存したいのですが、このコードですと拡張子までついてしまいます。 拡張子を除去するためにはどうすればよいでしょうか? アドバイス宜しくお願い致します。 Sub test() 'シート名の変更 Dim MyPath As String Dim MyFile As String Dim Wb As Workbook MyPath = "C:\TEST\" MyFile = Dir(MyPath & "*.xlsx") Do While MyFile <> "" Set Wb = Workbooks.Open(MyPath & MyFile) ActiveSheet.Name = ActiveWorkbook.Name Application.DisplayAlerts = False Wb.Save Application.DisplayAlerts = True Wb.Close (False) MyFile = Dir() Loop End Sub

  • ブックCloseでVBAが続かない

    エクセル2002を使用しています ブック(A)をコピーして名前(B)をつけて別ブックで保存しました ブック(A)を呼び出し後、ブック(B)を閉じてブック(A)のVBAを継続したいのですが 継続しません 作成したモジュールは以下です   Application.DisplayAlerts = False   '【不要なシートを削除する】 Sheets(Array("注文書入手差異表", "入手予定履歴", "main", "営C")).Select ActiveWindow.SelectedSheets.Delete   '【ThisWorkbook.Pathの『注文書確認フォルダ』の中に、名前をつけて別ブックで保存する   '   …ユーザーフォームを使用するのでマクロごと保存】 Dim myFolder As String Dim Filename As String myFolder = ThisWorkbook.Path & "\注文書確認フォルダ" Filename = Format(Date, "yyyymmdd") & "注文書入手予定表" If Dir$(myFolder, vbDirectory) = "" Then MkDir myFolder End If ActiveWorkbook.SaveAs Filename:= _ myFolder & "\" & Filename Application.DisplayAlerts = True '【保存した別ブック名を再取得】 Dim myName0 As String myName0 = ThisWorkbook.Name   '【コピー元のファイルを開く】 Dim myPath As String myPath = Application.Substitute(ThisWorkbook.Path, "\注文書確認フォルダ", "") Workbooks.Open (myPath & "\" & "注文書入手予定表")   MsgBox "【注文書確認フォルダ】の中に別ブックが作成されました"     '【保存した別ブックを閉じる】 Workbooks(myName0).Activate Windows(myName0).Activate ActiveWorkbook.Close '******下のマクロが続かない***************** '====================== Call Macro6 '======================   VBA ステップインで原因を探ろうとしたのでですが   「中断モードでは入力できません」のメッセージがでて   デバッグができません   八方ふさがりの状態です。助けていただけませんか。

  • ExecuteExcel4Macroでセル値取得

    office2010 あるフォルダにファイルを入れて、ファイルを開かずに対象シートの対象セルの値を取得したいです。 この取得したいセル情報を、変数で指定したいのです。 C:\dataに取得元のファイルが入っています。 このファイル名((1))は、いろいろ変わりますが、中にH4という文字があります。 対象シートのシート名とセルアドレスは、別のファイル(これにマクロがあります) のsettingシートで指定します。 1例ですが、settingシートの B2に11_001 C2にAF9 と設定します。 (1)のファイルで11_001というシートのAF9セル値を取得したいのです。 Dim myPath As String Dim myFile As String myPath = "C:\data\" myFile = Dir(myPath & "*H4*.xlsm") Dim sheetname As String Dim cell As String sheetname = Worksheets("setting").Range("B2") cell = Worksheets("setting").Range("C2").Value ' 'Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!R9C32") Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!" & cell & "") 上記で、 Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!R9C32") は、値取得できます。 このR9C32を変数にする所で、エラーが発生します。 実行時エラー1004と。 いろいろWEB見て、’,スペース等を入れてみましたが、どうしても分からず、 Range("A1") = ExecuteExcel4Macro("'[" & myFile & "]" & sheetname & "'!" & cell & "") の最後のセル指定を、変数で設定する方法を教えて頂きたく。

  • VBA ユーザーフォームの内容を別のブックに反映

    皆様、宜しくお願い致します。 私はVBA歴が浅く初心者に近いため、何卒ご教示の程お願い申し上げます。 今回、「ユーザーフォーム.xlsm」のファイル名でVBAのユーザーフォームを作成しました。 このユーザーフォームで入力した内容を別のブックである「ご意見箱.xlsx」の「sheet1」に 反映させたいです。 「ユーザーフォーム.xlsm」と「ご意見箱.xlsx」の両ファイルは、「デスクトップ」上に置いております。 ユーザーフォーム上の「確定保存」という名称のコマンドボタンをクリックしたタイミングで、 下記のような動作をさせるべく、イベントの構文で記述しました。 ~動作させたいフロー~ (1)ユーザーフォーム画面上で該当するオプションボタン(キャプション)一つを選択し、テキストボックスにテキストを入力して (2)「確定保存」のコマンドボタンをクリックすると (3)バックグラウンドで「ご意見箱.xlsx」の「sheet1」をファイルオープンさせて (4)「ご意見箱.xlsx」の「sheet1」の最終行(新規行)を取得して (5)A列の最終行(新規行)の「No.」欄に自動で連番を入力させて (6)C列の最終行(新規行)にオプションボタン(キャプション)内容を反映させ、D列も同じく最終行(新規行)にテキストボックスの内容を反映させて (7)そのまま自動で上書き保存させてファイルを閉じさせる。 (8)もし、オプションボタン(キャプション)の未選択やテキストボックスの未入力があった場合は、入力を促すメッセージを表示させる。 ~上記フローのように動作させるためのソース~ Private Sub CommandButton_Click() Dim tBk As Workbook Dim p As String Dim tSh As Worksheet Dim i As Long Dim j As Long Dim v As Boolean If Me.TextBox = "" Then MsgBox "ご意見入力欄を入力して下さい。m(_ _)m" Exit Sub Else v = False For i = 1 To 3 'オプションが連番になっているとして、最終番号まで If Me.Controls("OptionButton" & i).Value = True Then v = True Exit For End If Next If v = False Then MsgBox "所属部署を選択して下さい。m(_ _)m" Exit Sub End If End If p = ThisWorkbook.Path & "\ご意見箱.xlsx" If Dir(p) <> "" Then Application.ScreenUpdating = False Set tBk = Workbooks.Open(p) Else MsgBox "ご意見箱.xlsx 無し" Exit Sub End If Set tSh = tBk.Worksheets("Sheet1") With tSh j = .Range("A" & Rows.Count).End(xlUp).Row .Cells(j + 1, "A") = .Cells(j, "A") + 1 .Cells(j + 1, "C") = i 'Me.Controls("OptionButton" & i).Caption .Cells(j + 1, "D") = Me.TextBox.Text End With tBk.Save tBk.Close Application.ScreenUpdating = True End Sub ~現状で困っている点~ 現状では、フローで云うところの(2)と(8)の部分は動作しているのですが、(3)~(7)の部分で動作しないため、つまづいている状況です。 ユーザーフォームの画面構成と反映先となる「ご意見箱.xlsx」ファイルの「sheet1」の構成イメージ図は、画像添付のとおりとなっております。 使用アプリケーション:Excel 2013です。 諸先輩方からの大変貴重なアドバイスを賜り、それをベースにに自助努力でトライ&エラーを繰り返してきたのですが、もし具体的にお分かりになる方がいらっしゃいましたら、皆様からご教示賜りたく何卒宜しくお願い申し上げます。(拝)

  • エクセルVBAでブックを開くと処理が終わってしまう

    VBA初心者なのですが、VBAでエクセルブックを開くとVBAの処理が終わってしまいます。理由がわからないのでアドバイスをお願いします。なお、止まってしまう箇所にコメントを入れプログラムを下記しました。また、4000字以上質問できないためプログラムの途中までしか書かれていません。そのため、余分な宣言が多数ありますが無視してください。よろしくお願いいたします。 Option Base 1 Sub 健康診断の郵送() Dim kyoNum() As String Dim b_name As String Dim a_name() As Variant Dim b_address As String Dim a_address() As Variant Dim mailNum() As Variant Dim place() As String Dim banchi() As String Dim ken() As String Dim Adr As String Dim AdrLen As Integer Dim i, j, k, cnt, l, m As Integer Dim ChrCode As Integer Dim cell As Range Dim Book1 As String Dim wb As Workbook Dim Book1_Path As String Dim flag As Boolean 'セルのクリア ThisWorkbook.ActiveSheet.Cells.ClearComments 'セルのプロパティを設定をする With ThisWorkbook.ActiveSheet.Columns("A:B") .ShrinkToFit = True .NumberFormatLocal = "@" .ColumnWidth = 45 End With 'カレントディレクトリのチェンジ(Windows2000以降) CreateObject("WScript.Shell").CurrentDirectory = ThisWorkbook.Path '簡易名称Book1にする Book1 = "Book1.xlsx" 'パスを取得する Book1_Path = ThisWorkbook.Path & "\" & Book1 If Dir(Book1_Path) = "" Then MsgBox "Book1.xlsxファイルが存在しません。", vbExclamation End If '同名ブックのチェック For Each wb In Workbooks If wb.Name = Book1 Then MsgBox "健康診断の郵送.xlsmはBook1を開こうとしています" _ & vbCrLf & "Book1を閉じて再実行してください", vbExclamation Exit Sub End If Next wb Application.ScreenUpdating = False '画面の更新を止める Workbooks.Open Book1_Path '*****←ここで処理が終わってしまう***** 'ブック名を指定して非表示 Application.Windows("Book1.xlsx").Visible = False '後方検索でBook1.xlsxの入力済みセルの行数と列数を取得 With Workbooks("Book1.xlsx").ActiveSheet.UsedRange Book1_MaxRow = .Find("*", , xlValues, , xlByRows, xlPrevious).Row - 2 'データ入力済み行数取得 End With Application.ScreenUpdating = True Workbooks("Book1.xlsx").Activate j = 1 ReDim kyoNum(Book1_MaxRow) ReDim a_name(Book1_MaxRow) ReDim a_address(Book1_MaxRow) ReDim mailNum(Book1_MaxRow) ReDim ken(Book1_MaxRow) ReDim place(Book1_MaxRow) ReDim banchi(Book1_MaxRow)

  • リストボックスにExecuteExcel4Macroで取得したデータを表示したいのですが

    インターネットと参考書を利用して独学で仕事用VBAを作成している者です。 素人なりにいろいろ試してはいるのですがうまくいかないのでご教授願えたらと思い投稿しました。 質問は2つ+α で、 1.そもそも表題にあることが可能なのか?不可能なのか? 2.可能であるならどの辺りを修正したら良いのか? です。 +α というのは、恥ずかしながら具体的な提示です。 よろしくおねがいします。 Private Sub CommandButton3_Click() TextBox1 = Sheets("Sheet1").Range("A1").Value Dim DYear Dim mypath Dim dateFpath DYear = TextBox1.Text mypath = ActiveWorkbook.Path dateFpath = mypath & "\Date" & DYear ChDir mypath & "\Date" & DYear 'dateFpath 'カレントフォルダ Dim FCnt As Integer FCnt = 0 Dim dateName dateName = Dir(DYear & "証票*.xls") Dim sx As Long 'シートの列番号 ListBox1.ColumnCount = 6 '3列表示 ListBox1.ColumnWidths = "100 pt;35 pt;35 pt;35 pt;35 pt;35 pt;35 pt;35 pt;35 pt" '表示する列の幅 Dim nen nen = "年月日" Dim ji ji = "時" Dim fun fun = "分" Do While dateName <> "" FCnt = FCnt + 1 sx = 4 dateName = Dir() With ListBox1 .AddItem .List(FCnt, 0) = dateName '1列目 .List(FCnt, 1) = nen '2列目 sx = sx + 1 .List(FCnt, 2) = Application.ExecuteExcel4Macro("'" & dateFpath & "\[" & dateName & "]Sheet1'!R4C" & sx).Value '3列目 sx = sx + 1 .List(FCnt, 3) = Application.ExecuteExcel4Macro("'" & dateFpath & "\[" & dateName & "]Sheet1'!R4C" & sx).Value '4列目 sx = sx + 1 .List(FCnt, 4) = Application.ExecuteExcel4Macro("'" & dateFpath & "\[" & dateName & "]Sheet1'!R4C" & sx).Value '5列目 sx = sx + 2 .List(FCnt, 5) = Application.ExecuteExcel4Macro("'" & dateFpath & "\[" & dateName & "]Sheet1'!R4C" & sx).Value '6列目 sx = sx + 1 .List(FCnt, 6).Value = ji '7列目 .List(FCnt, 7) = Application.ExecuteExcel4Macro("'" & dateFpath & "\[" & dateName & "]Sheet1'!R2C" & sx).Value '8列目 sx = sx + 1 .List(FCnt, 8).Value = fun '9列目 End With Loop MsgBox FCnt & "個のデータが見つかりました" End Sub 以上です。 ループ1順目の3列目で停止してしまいます。 変数の値は確認しています。 よろしくお願いします。

  • VBA 探しているFileがないときの処理方法

    現在、下記のようにしてマクロ実行ブックと同じ階層のフォルダ名を取得してAに、フォルダ内のabc.XLSのC9の値をBに、abc.XLSの更新日時をCに表示させています。 このとき、フォルダ内にabc.XLSが無い場合にファイル名をAに書き出してB及びCは空白というように表示したいのですが、どのようにすればよろしいでしょうか。 macro1は以前質問させて頂いたものがベースになっています。ExecuteExcel4Macroを使っている関係でファイル名が無いときの処理はDirを使ってできるとmougで調べてわかりましたが、自分の知識ではできず、macro2を作成したのですが、指定ファイルがない場合の処理がうまくできずにいます。 macro1はファイルオープンの窓が開きます。macro2はファイルが存在しないという窓が開きます。 どちらの場合でもかまいませんのでお力をお貸し頂けませんでしょうか。 Sub macro1() Dim myPath As String Dim myFolder As String Dim r As Long r = 3 myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" Application.ScreenUpdating = False Range("A3:C60").Clear Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Cells(r, 1) = myFolder Cells(r, 2).Value = ExecuteExcel4Macro("'" & myPath & myFolder & "\[" & myBook & "]Sheet1 '!R9C3") On Error Resume Next Cells(r, 3) = FileDateTime(myPath & myFolder & "\" & myBook) On Error GoTo 0 If Cells(r, 3) = "" Then Cells(r, 2) = "myBook" End If Cells(r, 2).NumberFormatLocal = "#,##0_ " Cells(r, 3).NumberFormatLocal = "y""年""m""月""" With Range("A3:C60") .Sort Key1:=Range("C3"), Order1:=xlAscending .Borders.LineStyle = True End With r = r + 1 End If End If myFolder = Dir() Loop Application.ScreenUpdating = True End Sub Sub Macro2() Dim myPath As String Dim myFolder As String Dim myBook As String myPath = ThisWorkbook.Path & "\" myFolder = Dir(myPath, vbDirectory) myBook = "abc.XLS" i = 2 Do Until myFolder = "" If myFolder <> "." And myFolder <> ".." Then If (GetAttr(myPath & myFolder) And vbDirectory) = vbDirectory Then Workbooks.Open (myPath & myFolder & "\" & myBook) Range("C9").Activate Selection.Copy ThisWorkbook.Activate Cells(i, 1) = myFolder Cells(i, 2).PasteSpecial xlValues Cells(i, 3) = FileDateTime(myPath & myFolder & "\" & myBook) Workbooks(myBook).Close SaveChanges:=False i = i + 1 End If End If myFolder = Dir() Loop End Sub

  • コンボボックスのvba 作成の仕方

    私は、月別にデータを作っています。なので、月ごとにデータを見られるようなボタンを作成したいです。 現在組んでいるマクロは、ボタン(普通の四角いもの)を押すごとに、翌月データをコピペするというものになっています。 (以下、現在のコード記載) Sub auto_open() Dim wkm As Long Dim wkn As Long Dim wkt As Variant Dim wks As Variant Dim dt As Date Dim mi As Integer dt = Date mi = Month(dt) wkt = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) wks = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) wkm = wkt(mi) Call Macro1(wkm) Sheets("住宅資金").Range("A3") = wks(mi) End Sub Sub Next_Month() Dim wks As Variant Dim dt As Date Dim mi As Integer wks = Array(0, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9) If Sheets("住宅資金").Range("A3") = 12 Then wkm = 10 Else wkm = wks(Sheets("住宅資金").Range("A3") + 1) End If Call Macro1(wkm) wks = Array(0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3) Sheets("住宅資金").Range("A3") = wks(wkm) End Sub Sub Macro1(ByVal wkm As Long) With Sheets("入力") Sheets("住宅資金").Range("D5:D23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("J5:J23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("P5:P23").Value = .Range("T28:T46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("O5:O23").Value = .Range("T5:T23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("F5:F23").Value = .Range("O5:O23").Value Sheets("住宅資金").Range("L5:L23").Value = .Range("O28:O46").Value End With With Sheets("目標") Sheets("住宅資金").Range("C5:C23").Value = .Range("B4:B22").Offset(, wkm - 1).Value Sheets("住宅資金").Range("I5:I23").Value = .Range("B27:B45").Offset(, wkm - 1).Value End With With Sheets("前年同期") Sheets("住宅資金").Range("H5:H23").Value = .Range("C5:C23").Offset(, wkm - 1).Value Sheets("住宅資金").Range("N5:N23").Value = .Range("C28:C46").Offset(, wkm - 1).Value Sheets("住宅資金").Range("Q5:Q23").Value = .Range("T5:T23").Offset(, wkm - 1).Value End With End Sub さて、現在作りたいと思っているものを以下に記述します。 普通の四角いボタンではなく、コンボボックスを使用して、矢印(▼)を押すことによってリストが表れ、 「1月」に合わせたら1月のデータがコピペされる、「8月」に合わせたら8月のデータがコピペされる、というものを作りたいと思っています。 以下のような空欄の表を作成したシートがあります。        A    B    C   D 1      目標  実績  …   … 2 ○支所   3 △支所 4  ・ 5  ・ 6  ・ 別のシートに、手入力した月別のデータがあります。 空欄のシートのどこかにコンボボックスを作り、別シートの○月のデータを貼り付けられるようにしたいと思っています。 コンボボックスの作り方がわからず、後一歩のところでつまずいてしまいました。 知恵をお貸しください。 よろしくお願いいたします。

  • 別のブックへ貯蓄転記する方法を教えてください。

    請求書をエクセルで作ることになりました。 請求書自体はできたのですが、 請求書内容を別のブックに貯蓄保存がどうしてもできません。 ブック「A」のM1~R1のみが転記対象。VLOOKUPを使ってデータをひいています。 ブック「B」のA3~F3に貯蓄&転記したいと考えています。 色々なサイトを見て、下記のコードを作ったのですが、貯蓄できません・・・ (上書保存のような状態になります) 初心者のため、何が間違っているのかわかりません。 ご教授いただければと思います。 よろしくお願いいたします。 Sub SAVE() Const Dest = "C:\Users\P\Desktop\Y\B.xlsx" Dim fromR As Long Dim fromRMax As Long Dim toR As Long Dim toRMax As Long '?????? toRMax = Workbooks("B.xlsx").Worksheets("Sheet1").Range("A65536").End(xlUp).Row fromRMax = Workbooks("A.xlsm").Worksheets("Sample").Range("A65536").End(xlUp).Row '?? For fromR = 2 To fromRMax 'Date Workbooks("B.xlsx").Worksheets("Sheet1").Cells(toRMax + fromR - 1, 1).Value = _ Workbooks("A.xlsm").Worksheets("Sample").Cells(fromR, 13).Value 'No. Workbooks("B.xlsx").Worksheets("Sheet1").Cells(toRMax + fromR - 1, 2).Value = _ Workbooks("A.xlsm").Worksheets("Sample").Cells(fromR, 14).Value 'Sub Workbooks("B.xlsx").Worksheets("Sheet1").Cells(toRMax + fromR - 1, 3).Value = _ Workbooks("A.xlsm").Worksheets("Sample").Cells(fromR, 15).Value '13% Workbooks("B.xlsx").Worksheets("Sheet1").Cells(toRMax + fromR - 1, 4).Value = _ Workbooks("A.xlsm").Worksheets("Sample").Cells(fromR, 16).Value '5% Workbooks("B.xlsx").Worksheets("Sheet1").Cells(toRMax + fromR - 1, 5).Value = _ Workbooks("A.xlsm").Worksheets("Sample").Cells(fromR, 17).Value 'Total Workbooks("B.xlsx").Worksheets("Sheet1").Cells(toRMax + fromR - 1, 6).Value = _ Workbooks("A.xlsm").Worksheets("Sample").Cells(fromR, 18).Value Next fromR End Sub

専門家に質問してみよう