VBA 初心者で勉強中です。
急遽管理表を作成することになりました。
ネットで調べながら構築していますが煮詰まっています。
申し訳ございませんがご助言ご教示お願いいたします。
前提・実現したいこと
仕様として、2つブックを用意し、1つは入力フォーム、2つ目はデータ蓄積のデータベースブック。
・ブック1=ブック名:入力フォーム.xlsm、シート名:入力フォーム
・ブック2=ブック名:データシート.xlsm、シート名:データシート
・ブック1はコピーし複数人で利用します。(複数の入力フォームブックで作成したデータを、逐一データベース用のブックに蓄積していき、必要に応じて呼び出す)
・ブック1からブック2へデータを転記し蓄積するたび、ブック2は以下コードで定義を更新しています。
wb.Names("データシート").RefersTo
1wb.Activate 2ws.Select 3ws.Cells(ws.Rows.Count, 2).End(xlUp).Offset(1, 0).Select 4Application.DisplayAlerts = False 5wb.Save 6Application.DisplayAlerts = True 7wb.Close False 8コード
利用手順
A.ブック1、入力フォームのセルに転記された内容をコマンドボタン「転記」にて、ブック2、データ蓄積のデータベースブックに転記する。
ブック1セルJ2は通し番号になっており、ブック2のA列に転記されていく
転記したい内容のセルも其々ブック2に転記される
例).ブック2のA~M、AH~AM列は同じ(A71984~A71992は同じ)N~AGは違う(N71984~N71992は其々違う)
※上記Aは作成できました。
B.ブック1の指定セル(ここではJ1)にブック2のA列の通し番号を入力し、
呼び出しのマクロを開始すると、ブック1にブック2の内容が呼び出しされる。
以下、実現(構築)したいこと
例).ブック1のセル「J1」に通しNo.の「31」を入力し、ブック2のA列を参照し、該当データをブック1へ呼び出す(転記)
また、ブック2からブック1への呼び出しの際は「値のみ貼りつけ」で転記したいです。
↓【ブック2"データシート.xlsm"、シート名"データシート"】 蓄積されたデータシート
蓄積範囲A2~AM*は増えた分名前の定義を更新しています。名前定義:データシート
↓【ブック1"入力フォーム.xlsm"、シート名"入力フォーム"】 呼び出し後のイメージ
発生している問題
ブック2からブック1へ転記する際、フィルターをかけ見出し以外を選択したいですが、見出し部分が転記されてしまいます。
エラーが発生せずどこが原因か分からないでいます。
おそらく以下コードが原因だと推測してるのですが、躓いています。
'見出し行を除いた可視セル範囲を選択 Set myRange = Application.Intersect(dataTable.SpecialCells(xlCellTypeVisible), dataTable.Rows("2:" & dataTable.Rows.Count)) ThisWorkbook.Worksheets("入力フォーム").Range("A4").Value = myRange.Cells(7).Value 'ブック2フィルターされた7列目をブック1A4に転記 ThisWorkbook.Worksheets("入力フォーム").Range("C9").Value = myRange.Cells(36).Value 'ブック2フィルターされた36列目をブック1C9に転記 ThisWorkbook.Worksheets("入力フォーム").Range("C11").Value = myRange.Cells(35).Value 'ブック2フィルターされた35列目をブック1C11に転記 ThisWorkbook.Worksheets("入力フォーム").Range("K12").Value = myRange.Cells(34).Value 'ブック2フィルターされた34列目をブック1K12に転記 ThisWorkbook.Worksheets("入力フォーム").Range("K13").Value = myRange.Cells(38).Value 'ブック2フィルターされた38列目をブック1K13に転記 ThisWorkbook.Worksheets("入力フォーム").Range("F13").Value = myRange.Cells(39).Value 'ブック2フィルターされた39列目をブック1F13に転記
該当のソースコード
全コード
Sub 呼び出し() Dim tmpint As Variant, dataTable As Range, myRange As Range, i As Long Dim wb As Workbook, ws As Worksheet Dim myPath As String, fn As String Dim j As Long myPath = "\共有サーバ\" fn = "データシート.xlsm" '自PCで(データシート)が開いていたら閉じる On Error Resume Next Set wb = Workbooks(fn) On Error GoTo 0 If Not wb Is Nothing Then wb.Close False End If Application.DisplayAlerts = False Set wb = Workbooks.Open(Filename:=myPath & fn, Notify:=False) Application.DisplayAlerts = True If wb.ReadOnly Then MsgBox "他の人が作業中です。しばらく経ってから呼び出しし直してください。" wb.Close False Exit Sub Else Set ws = wb.Sheets("データシート") wb.Activate ws.Activate End If Application.ScreenUpdating = False '検索値のセット(ブック1入力フォーム) tmpint = ThisWorkbook.Worksheets("入力フォーム").Range("J1").Text '検索元テーブルセット(データシートの名前の定義"データシート") Set dataTable = wb.ws.Range("データシート") '検索値でオートフィルタ(ブック2データシート) dataTable.AutoFilter 1, tmpint '検索値がなければメッセージを表示して処理を抜ける Set myRange = dataTable.SpecialCells(xlCellTypeVisible) If myRange.Cells.Count = myRange.Columns.Count Then MsgBox "該当するレコードはありませんでした" dataTable.AutoFilter Exit Sub End If '見出し行を除いた可視セル範囲を取得 Set myRange = Application.Intersect(dataTable.SpecialCells(xlCellTypeVisible), dataTable.Rows("2:" & dataTable.Rows.Count)) ThisWorkbook.Worksheets("入力フォーム").Range("A4").Value = myRange.Cells(7).Value 'ブック2フィルターされた7列目をブック1A4に転記 ThisWorkbook.Worksheets("入力フォーム").Range("C9").Value = myRange.Cells(36).Value 'ブック2フィルターされた36列目をブック1C9に転記 ThisWorkbook.Worksheets("入力フォーム").Range("C11").Value = myRange.Cells(35).Value 'ブック2フィルターされた35列目をブック1C11に転記 ThisWorkbook.Worksheets("入力フォーム").Range("K12").Value = myRange.Cells(34).Value 'ブック2フィルターされた34列目をブック1K12に転記 ThisWorkbook.Worksheets("入力フォーム").Range("K13").Value = myRange.Cells(38).Value 'ブック2フィルターされた38列目をブック1K13に転記 ThisWorkbook.Worksheets("入力フォーム").Range("F13").Value = myRange.Cells(39).Value 'ブック2フィルターされた39列目をブック1F13に転記 'フィルターをかけた後、ブック2の見出し除くセルN3からAG最下行を選択 With ws With ws.Range("A1").CurrentRegion j = .Rows.Count .Range(.Cells(3, 14), .Cells(j, 33)).Copy End With End With 'ブック1のセルB16に貼りつけ ThisWorkbook.Worksheets("入力フォーム").Range("B16").PasteSpecial (xlPasteValues) dataTable.AutoFilter 'フィルタ解除 wb.Close False Application.ScreenUpdating = True End Sub
試したこと
以下コードのように、ブックを1つで2シート(入力フォームシート、データシートシート)での作成では呼び出し(転記)ができました。
ですがブックを2つに分けた際上記の問題がでてしまいます。
ブック名:入力フォーム.xlsm、シート名:sheet1="入力フォーム"、sheet2="データシート"
Sub 呼び出し() Dim tmpint As Variant, dataTable As Range, myRange As Range, i As Long Dim fieldList(), rangeList() '検索値のセット tmpint = Sheets("入力フォーム").Range("J1").Text '検索元テーブルセット(range"データシート"は名前の定義) Set dataTable = Sheets("データシート").Range("データシート") '転記したいフィールド(データシートsheet)を指定 fieldList = Array(9, 10, 11, 12) '転記先(入力フォームsheet)のセル位置を指定 rangeList = Array("B12", "C12", "D12", "E12") '検索値でオートフィルタ dataTable.AutoFilter 1, tmpint '検索値がなければメッセージを表示して処理を抜ける Set myRange = dataTable.SpecialCells(xlCellTypeVisible) If myRange.Cells.Count = myRange.Columns.Count Then MsgBox "該当するレコードはありませんでした" dataTable.AutoFilter Exit Sub End If '見出し行を除いた可視セル範囲を取得 Set myRange = Application.Intersect(dataTable.SpecialCells(xlCellTypeVisible), dataTable.Rows("2:" & dataTable.Rows.Count)) Range("I9").Value = myRange.Cells(2).Value 'データシート2列目を入力フォームI9に転記 Range("I6").Value = myRange.Cells(3).Value 'データシート3列目を入力フォームI6に転記 Range("I7").Value = myRange.Cells(4).Value 'データシート4列目を入力フォームI7に転記 Range("I1").Value = myRange.Cells(5).Value 'データシート5列目を入力フォームI1に転記 Range("C4").Value = myRange.Cells(6).Value 'データシート6列目を入力フォームC4に転記 Range("C5").Value = myRange.Cells(7).Value 'データシート7列目を入力フォームC5に転記 Range("C6").Value = myRange.Cells(8).Value 'データシート8列目を入力フォームC6に転記 '指定したフィールド(データシートsheet)を指定したセル位置(入力フォームsheet)に転記 For i = 0 To UBound(fieldList) myRange.Columns(fieldList(i)).Copy Range(rangeList(i)) Next dataTable.AutoFilter 'フィルタ解除 End Sub コード
回答2件
あなたの回答
tips
プレビュー