• ベストアンサー

VBAの記述で、あるシートを別ファイルにした場合

エクセル2002で、商品を管理しています。 1列目に品番をいれると、2列目に品名が表示するようにし、 新規の品番は品名を入れると、追加登録されるようにVBAを組みました。 今度、このシート"商品"を別ファイル(商品.xls)にしたいと思うのですが、 どうしても、やり方が分かりません。 よろしくお願いします。 Public Sub Worksheet_Change(ByVal Target As Excel.Range) Dim 品番 As String Dim 品名 As String Dim i As Long With Target If .Column = 1 Then 品番 = .Text For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then ActiveSheet.Cells(.Row, 2) = "" Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then ActiveSheet.Cells(.Row, 2) = Sheets("商品").Cells(i, 2) Exit For End If Next i End If If .Column = 2 Then 品名 = .Text 品番 = ActiveSheet.Cells(.Row, 1) If 品名 = "" Or 品番 = "" Then Else For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then Sheets("商品").Cells(i, 1) = 品番 Sheets("商品").Cells(i, 2) = 品名 Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then Exit For End If Next i End If End If End With End Sub

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

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

補足に対するお手数をおかけいたしました。早速サンプルマクロを作ってみました。以下のように操作してみて下さい。 1.商品台帳.xlsというブックと商品コードというブックを新規に作る。それぞれのブックのシート1のA1にコード・B1に商品名と入力する。 2.商品台帳.xlsのVBE画面を開き、VBEProjectの下にあるThisWorkbookをダブルクリックしてThisWorkbookのコードエディターを開く。 3.そのコードエディターに下記のコードをコピー・ペーストする。 Private Sub Workbook_Open() Dim myBook As Workbook Dim myWbn As String For Each myBook In Workbooks myWbn = myBook.Name If myBook.Name = "商品コード.xls" Then Exit Sub Next Workbooks.Open ("C:\My Documents\商品コード.xls") Workbooks("商品台帳.xls").Activate End Sub 4.Sheet1のコードエディターを開き、下記のコードをコピー・ペーストをする。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myRow As Integer Dim myWsn As Worksheet Dim myCell As String Dim myRange As Range myRow = Target.Row If Target.Address = Range("A" & myRow).Address _ Or Target.Address = Range("B" & myRow).Address Then Set myWsn = Workbooks("商品コード.xls").Worksheets(1) myCell = myWsn.Range("A1").CurrentRegion.SpecialCells(xlCellTypeLastCell).Address Set myRange = myWsn.Range("A2:" & myCell).Find(Target.Value, lookat:=xlWhole) Application.EnableEvents = False If myRange Is Nothing Then If Target.Address = Range("A" & myRow).Address Then myWsn.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Target.Value Else myWsn.Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Value = Target.Value End If Else Target.Offset(0, 1).Value = myRange.Offset(0, 1).Value Target.Offset(0, 1).Columns.EntireColumn.AutoFit End If Application.EnableEvents = True End If End Sub あなた様のおやりになりたいことが、できます。 何か不都合なことがありましたら、ご遠慮なくお知らせ下さい。修正サンプルマクロを作りたいと思います。

ebis
質問者

お礼

問題なく稼動しました。 親切に他Bookを開くマクロまで作ってもらって、助かります。 ただ、私の勉強不足でと、VBA記述のレベルが高いせいか、内容理解には時間がかかりそうです。 当面の改造とかを考え、#1の方法と合わせて使わせていただきます。 丁寧な回答ありがとうございました。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#3の者です。#4のkazuhikoのさんほか詳しく読んでくだっさったようで、まずお礼を申し上げます。他の方ebisさんのご質問・解答の場ですが一言 言い訳めいたことを述べさせていただきます。 (1)xlPartのこと   A.縦1列の検索と決まっているのでxlPartでも良いか     と思いました。それにしてはCellsになっていますね    。Range()にしたかったのですが。   B小数例ながらテストをしており、問題なく動きましたの    でそのままにしました。   もう少し詳しい、不適当な理由がわかれば教えてください。 (2)Activateの多用の点   私自身気かひけていて、懸念を解答の末尾に書いておりま  す。今後勉強して今後は改善したいと思います。   オブジェクト宣言方式?では危ないと過去の経験から推定して、解答の締め  きられる時間を気にして、その方式でテストする時間が取れな  いと、取りあえず載せました。別のブックの場合も、   WB(1).WS(2).Range(3)で1の部分に   Book名を指定して(単一Bookの場合と同じく)参  照出来ればといつも思いますが、(今回別ブックの参照でてこずり、エラーがでて)うまくいかないケースが多いので諦めました。勉強不足と資料不足で、根本のところが迷いがあり、小生の弱点と心得ております。今後とも宜しく。

回答No.4

#No3のご回答で気になる点がありましたので、生意気ながら意見を述べさせていただきます。 1.Findメソッドで、引数のLook AtにXlpartを指定しておりますが、これでは、私が以前Findメソッドを使ってこの方法で検索をかけた結果、うまく検索ができなかったことがあります。この場合、必ずlook Atには、xlwholeを指定するべきかと思います。 2.処理するときに対象となるブックをいちいちアクティブにしているようですが、変数を2個worksheet型で宣言し、その変数にそれぞれのブックのシート名を代入すれば、もっと簡単になるのではないでしょうか。 以上気がついて点を生意気ながら書かせていただきました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

(1)Booka.xlsのSheet1にA1:B10に コード 商品名 1 ノートA4 2 定規 4 鉛筆 5 消しゴム 6 挟み 7 マーカー 9 ボールペン 10 糊 12 ナイフ をテストで作りました。 (2)Bookb.xlsを作り保存する。 (3)Bookb.xlsを開き、そのModule1に Sub test02() Workbooks.Open ("c:\My Documents\Booka.xls") End Sub を作る。そして実行しBooka.xlsを開いておく。 ----- Bookb.xlsを開いているところで もう一つModule1に Private Sub Worksheet_Change(ByVal Target As Range) Dim z As Object 'MsgBox Target r = Target.Row c = Target.Column If c = 1 Then Windows("booka.xls").Activate Set z = ActiveWorkbook.Worksheets("Sheet1").Cells.Find(What:=Target, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByColumns, SearchDirection:=xlNext, MatchCase:=False) ' If z Is Nothing Then ' MsgBox "コード無し" ' Exit Sub ' End If x = z.Offset(0, 1) Windows("bookb.xls").Activate ActiveWorkbook.Worksheets("Sheet1").Cells(r, c + 1) = x Else End If End Sub 異なるBookを参照するため行き来するのに、Activateを多用していますが、何か別の方法があるような気がする が取りあえず載せます。小数例でテスト済み。 またオフコードの入力に対しての備えやDELやその他多用な 入力に対する対処が考えらていません。あとは宜しく。

ebis
質問者

お礼

テストさせていただきました。 検索については、はうまく動作しました。 ちょっと画面がちらつきますが。 ありがとうございました。

回答No.2

はじめまして。 1.現在1つのブック(ブックAとする)に2つのシート(商品を管理するシートと品番と品名のみを記入したシート)がある。 2.今度、品番と品名のみを記入したシートを別ブック(ブックBとする)に移動する。 3.商品を管理するシートのA列に品番を入力したとき、入力された品番をブックBの中から探し、見つかった品番に対応する品名をブックAの品番の右隣に自動で表示させる。 4.もしブックAに入力した品番がブックBになかったら、ブックBの品番が書かれている最後のセル番地のすぐ下へ入力させ、その品番に対応する品名をその右隣に入力させる。 あなた様のやられたいことはこのようなことでよろしいのでしょうか。 もし、ちがうのであれば、あなた様のおやりになりたいことを上の要領でお知らせ下さい。 私でよろしければ、サンプルマクロを作ってみたいと思います。 お手数をおかけいたしますが、よろしくお願いいたします。

ebis
質問者

補足

遅れてすみません。 全て、おっしゃられている通りです。 よろしくお願い致します。

  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.1

下の様に修正してみました。 最初の4行を追加。コード内の『Sheets("商品")』を『ws2』に変更しました。 最初の4行で参照・修正するシートを変数ws2に割り当てています。 そのため、コードの意味合いは変更していません。ブック商品は開いてある前提です。 Public → Private にしています。 検索の方法としては、For~Next とは別に、Findを使う方法もあります。 Private Sub Worksheet_Change(ByVal Target As Excel.Range)   Dim wb2 As Workbook 'ブック商品   Dim ws2 As Worksheet 'ブック商品のシート商品     Set wb2 = Workbooks("商品.xls")     Set ws2 = wb2.Worksheets("商品")   Dim 品番 As String   Dim 品名 As String   Dim i As Long   With Target     If .Column = 1 Then       品番 = .Text       For i = 1 To 65536         If ws2.Cells(i, 1) = "" Then           ActiveSheet.Cells(.Row, 2) = ""           Exit For         ElseIf 品番 = ws2.Cells(i, 1) Then           ActiveSheet.Cells(.Row, 2) = ws2.Cells(i, 2)           Exit For         End If       Next i     End If     If .Column = 2 Then       品名 = .Text       品番 = ActiveSheet.Cells(.Row, 1)       If 品名 = "" Or 品番 = "" Then       Else         For i = 1 To 65536           If ws2.Cells(i, 1) = "" Then             ws2.Cells(i, 1) = 品番             ws2.Cells(i, 2) = 品名             Exit For           ElseIf 品番 = ws2.Cells(i, 1) Then             Exit For           End If         Next i       End If     End If   End With End Sub

ebis
質問者

お礼

やはり他Bookを開く方法しかないようですね。 #6の方法と合わせて使わせていただき、うまく稼動しました。 ありがとうございました。

ebis
質問者

補足

遅れてすみません。 回答ありがとうございます。 できれば、商品.xlsを開かずに実現できないものでしょうか。

関連するQ&A

専門家に質問してみよう