Excelのマクロについてです。全く手がつけられないのでお知恵を拝借願えませんでしょうか。
あるシートに記載された検索キーをもとに複数ブックを検索し、そのデータを含むシートを拾い出すという作業を考えています。
あるレコード(数は10~50程度)に格納された文字列を複数ブックにわたって完全一致検索し、その文字列が含まれるシートを逐一拾ってくる(コピーしてくる)というマクロを考えています。

<状態>
レコードが入ったシート"C:\サンプル住所.xls"の内容:
シートは一枚(シート名:検索元)
セルD5 東京都港区
セルD6 青森県青森市
セルD7 東京都港区
セルD8 北海道足寄町
セルD9 福岡県北九州市
レコードはすべて文字列です。この例では5つですが、レコード数は1~多くても50くらいの間で変動し、同じ文字列が複数回出現することもあります。セル結合はありません。

検索先であるデータベース(以下"DB")は下位ディレクトリ(Prefフォルダ)に各都道府県のブックを放り込んであります:
C:\Prefs\北海道.xls
C:\Prefs\青森.xls
C:\Prefs\宮城.xls
(以下続く)
これら各ブックはシート1枚のみの構成で、セル結合はありません。またデータの重複はありません。なおブックの総数は47都道府県分とは限らず、検索内容によって変動します。

<目標>
"DB"内に"東京都港区"が存在するかどうかを検索し、見つかったら"C:\サンプル住所.xls"の最後に該当シートを追加。見つからなかった場合は空白シートを追加。どちらの場合もシート名は連番&検索キーとします。
これをレコードの数だけループさせ、検索されたシートがぎっしり詰まったブックを完成させます。
つまり、完成後のシートは左から以下のように並びます。
検索元 > 1_東京都港区 > 2_青森県青森市 > 3_東京都港区 > 4_北海道足寄町 > 2_大阪府大阪市

検索の導入部分としてダイアログを出しDBのディレクトリを選ぶところや、シート名をつけなおすあたりはさすがに何とかなるのですが・・・
ワークシート関数でしたらそれなりに使えるのですが、ブックをまたいだ作業はどこから手をつければいいのか皆目わからず。
ポインタやヒント、サンプル等、ご教示頂けると大変助かります。

自分でどこまで組み立てたのか?の思考の過程すら提示できずお恥ずかしい限りですが、なにとぞよろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

あらかじめファイルリストを作成するサンプルです。


#2さんの書き込みを見て気づいたんですが、1レコード検索する毎に
全エクセルファイルをオープン、クローズしているので
実行速度が遅いかもしれません。

Option Base 0
Option Explicit

Sub test()
  Dim i As Long
  Dim j As Long
  Dim SearchWord As String
  Dim FileList() As String
  Dim FileCnt As Long
  Dim ws As Worksheet
  
  Set ws = ActiveSheet
  
  Application.ScreenUpdating = False
  'ディレクトリ指定でエクセルファイルのリストを作成する
  FileCnt = GetAllxlsFilesInDir("D:", FileList())
  
  For i = 1 To Range("D65536").End(xlUp).Row
    ws.Activate
    SearchWord = Range("D" & i)
    
    If SearchWord = "" Then
      GoTo NEXT_RECORD
    End If
    
    '毎回Openを繰り返しているので遅いかも・・・
    For j = 0 To FileCnt - 1
    
      Workbooks.Open(FileList(j)).Activate
      
      'レコードの検索
      If (Cells.Find(What:=SearchWord, after:=ActiveCell, LookIn:=xlFormulas, _
          LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
          MatchCase:=True, SearchFormat:=False) Is Nothing = False) Then
        
        '見つかったらシートのコピー&リネーム
        With ThisWorkbook
          ActiveSheet.Copy after:=.Sheets(.Sheets.Count)
          .Sheets(.Sheets.Count).Name = i & "_" & SearchWord
        End With
        
        '閉じて次のレコードを探す
        Workbooks(Dir(FileList(j))).Close savechanges:=False
        GoTo NEXT_RECORD
      End If
      
      Workbooks(Dir(FileList(j))).Close savechanges:=False
    
    Next j
    
    '見つからなかったら空白のシートを追加
    With ThisWorkbook
      .Activate
      Sheets.Add
      ActiveSheet.Move after:=.Sheets(.Sheets.Count)
      .Sheets(.Sheets.Count).Name = i & "_" & SearchWord
    End With
    
NEXT_RECORD:
  
  Next i
  
  ws.Activate
  
  Application.ScreenUpdating = True
  
  Erase FileList
  Set ws = Nothing
  
End Sub

'フォルダ内のエクセルファイルのファイルリスト作成
'引数1:検索フォルダパス 引数2:ファイルリスト
'戻り値:見つかったファイル数
Function GetAllxlsFilesInDir(ByVal strDirPath As String, ByRef xlsFiles() As String) As Long

  Dim strTempName As String
  Dim FileCnt  As Long
  
  On Error GoTo GetAllFiles_End

  FileCnt = 0
  ' strDirPath が "\" 文字で終わっていることを確認します。
  If Right$(strDirPath, 1) <> "\" Then
    strDirPath = strDirPath & "\"
  End If
  
  ' strDirPath がディレクトリであることを確認します。
  If GetAttr(strDirPath) And vbDirectory <> vbDirectory Then
    GoTo GetAllFiles_End
  End If
    
  'エクセルファイルを検索する
  strTempName = Dir(strDirPath & "*.xls")
  
  Do Until Len(strTempName) = 0
    
    ' "." と ".." を除外
    If (strTempName = ".") Or (strTempName = "..") Then
      GoTo NEXT_DIR
    End If
    
    If strTempName Like "*.xls" Then
      'サブフォルダリストに登録する
      FileCnt = FileCnt + 1
      ReDim Preserve xlsFiles(FileCnt)
      xlsFiles(FileCnt - 1) = strDirPath & strTempName
    End If
    
NEXT_DIR:
    ' Dir 関数を使用して、次のファイル名を検索します。
    strTempName = Dir()
  Loop
  
  
GetAllFiles_End:

  GetAllxlsFilesInDir = FileCnt
  
End Function
    • good
    • 0
この回答へのお礼

ありがとうございます。
原理はこれから勉強するところですが、ピンポイントで問題が解決できましたのでたいへん助かりました。
最初に回答を頂いた方の手順も美しいですが、こちらはいかにも動かしているといった感じでわかりやすいです。実行速度も特に気になりません。
大変勉強になりました。ありがとうございます。

お礼日時:2009/05/27 01:01

>複数ブックを検索し、


(1)
そのブックは1つのフォルダの下に有るのか。それなら
Googleで「フォルダ ファイル VBA」でWEB照会のこと。(先ほどもこの質問があった。)WEBに記事がいっぱいある。
DIR利用
FSO利用(FSOの意味は、Googleで照会のこと)
の2方式の解説がある。
(2)シート
1つのブック名を捉えたとき、全シート名を捉えるのは
Sub test01()
Set wb = Workbooks.Open("01化.xls")
For Each sh In wb.Worksheets
MsgBox sh.Name
Next
End Sub
のように簡単なコードで捉えられる。
(3)
しかしエクセルの操作で、検索・置換はブック全体(全シート、検索場所=ブック)を対象にできるようになっているから、それを使えば、全シートを個々に捕まえる必要ない。
(4)マクロの記録をとって、勉強すること
 (3)の操作をしてマクロの記録をとり、検索のコードがどのようになり、本質問のためには、どこを変えるべきか勉強のこと。マクロの記録を利用する事が質問に出ていないのはおかしい。
(5)問題はブックを開かずに処理が出来るかどうか。
Visible=Falseで画面に出さない程度で処理が速くできるのか
(先日も質問のあったが)エクセル4.0マクロで開かずに読んで処理できるのか、実際やってみないとわからない。
普通には質問者は、VBAの熟練者で無いようだから、ブックをOpenしー>処理しーー>Closeするの繰り返しで我慢してもらいたい。
エクセルはデータを別ブックに分けると処理がしづらい。この報いは必ず後でやってくる。表計算が多シートになったのもここ15年ぐらいだ。ファイルが別だと別世界。それを関連付けて扱うVBAの技量は上級者の者と思う。当面は無理しすぎの課題と思う。
    • good
    • 0
この回答へのお礼

は。すみません。背伸びどころではない内容です。
しかしこうして手順や原理から教えて頂けるのは大変有り難く思います。
すぐに答えが出なくても、この積み重ねでいずれは皆さんに回答者としてフィードバックできるよう、精進して参ります。
マクロの記録でいろいろいじってみたのですが、本文に書くと無駄に長くなってしまったのでばっさり切ってしまいました。手抜きのようで申し訳ありません。
ありがとうございました。

お礼日時:2009/05/27 00:58

#1です。



レコード毎にファイルを開く・閉じるも大変そうなので、一旦新規Bookを作成し、
そこに集めたシートを検索対象としてます。

Sub try()
Dim wb_main As Workbook
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim ws As Worksheet
Dim r As Range, rm As Range
Dim ch As Boolean
Dim Fname As String

Application.ScreenUpdating = False

Set wb_main = ThisWorkbook

' 一旦各ファイルのシート(1)を新規Bookに集める
Set wb1 = Workbooks.Add

Fname = Dir("C:\Prefs\*.xls")

Do Until Fname = ""

Set wb2 = Workbooks.Open("C:\Prefs\" & Fname)

wb2.Worksheets(1).Copy After:=wb1.Worksheets(wb1.Worksheets.Count)
ActiveSheet.Name = Replace(Fname, ".xls", "")

wb2.Close False

Fname = Dir()
Loop
' --------------------------------------------------

With wb_main.Worksheets("検索元")
Set rm = .Range(.Range("D5"), .Cells(Rows.Count, 4).End(xlUp))
End With

For Each r In rm

ch = False

For Each ws In wb1.Worksheets
If Application.CountIf(ws.Cells, r.Value) > 0 Then
ws.Copy After:=wb_main.Worksheets(wb_main.Worksheets.Count)
ActiveSheet.Name = wb_main.Worksheets.Count & "_" & ws.Name
ch = True
End If
Next

If ch = False Then Worksheets.Add After:=wb_main.Worksheets(wb_main.Worksheets.Count)

Next

Application.DisplayAlerts = False
wb1.Close
Application.DisplayAlerts = True

Set wb_main = Nothing
Set wb1 = Nothing
Set wb2 = Nothing
Application.ScreenUpdating = True
End Sub

意図が違ったらごめんなさい。
    • good
    • 0
この回答へのお礼

ありがとうございます。先にシートを拾ってしまうとさすがに動作が速いですね。
今回はこの方法は採用しませんでしたが、他に使いたい場所があるので活用させてください。
大変参考になりました。ありがとうございます。

お礼日時:2009/05/27 01:03

この例題の場合、


>セルD8 北海道足寄町
の検索対象ブックは
>C:\Prefs\北海道.xls
のみとなりそうですが違うのでしょうか?

「北海道足寄町」等のデータで『都道府県名』を基にすれば、複数ブックを
検索していく必要はないように思いますけど。

もし”例”としてあげているだけならば、スル~して下さい。

この回答への補足

ご指摘いただきありがとうございます。
検索キーや対象ブック名はあくまで例でして、キーの先頭数文字で対象となるブックを類推できるものではありません。
シート名はバラバラで、やはり前提どおり全てのブックを検索する必要があります。
あぁ、ボロの出ない例を考えていたのに・・・
何卒宜しくお願いします。

補足日時:2009/05/25 09:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVBA(マクロ)を勉強したい

VBAを勉強したいのですが、オススメの本等教えて下さい。
今FOM出版のマクロ入門を買って勉強しています。大体の基本操作は分かった気がします。

Aベストアンサー

こんにちは。

ここら辺が参考になると思います。

日本VBA協会の参考書籍
の準拠本
http://www.vbaa.jp/training/books.htm

アマゾンのExcelVBA
http://www.amazon.co.jp/exec/obidos/ASIN/4774119660/vbaajpn-22/249-7235447-7367506

QXL2003(VBA):ブックを指定して開き、元のブックの情報と見比べながら元のブックにまとめる

元のブックの情報と別のブックの情報をマージし、元のブックに上書きする方法を模索しています。

------以下、前置き--------

前回の質問内容:
http://oshiete1.goo.ne.jp/qa5346942.html
にて、シート間でデータを見ながらマージすることはできるようになりました。ありがとうございます。

以下はブック間ではなく、同ブック内の隣のシート間でやりとりする作業をマクロにしたものです。

1枚目のシートにある情報:
ABCDE
ユーザー名電話番号
B川B太0120-002
A山A郎0120-001A市在住
C岡C介0120-003

2枚目のシートにある情報:
ABCDE
ユーザー名 電話番号項目
F崎F二0120-006
G田G夫0120-007G県GG村
H村H子0120-008
C岡C介0120-003CC村
B川B太0120-002東京都B市



出力結果(1枚目のシート):
ABCDE
B川B太0120-002東京都B市
A山A郎0120-001A市在住
C岡C介0120-003CC村
F崎F二0120-006
G田G夫0120-007G県GG村
H村H子0120-008

で、皆様の助けを得て以下のマクロを書くまではできました。

Sub test01()

Columns("H:CZ").Select
Selection.ColumnWidth = 0


Dim sh1 As Worksheet, sh2 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
'--
d1 = sh1.Range("a65536").End(xlUp).Row
d2 = sh2.Range("a65536").End(xlUp).Row

k = 2
'---
For i = 2 To d1
sh1.Cells(k, "A") = sh1.Cells(i, "A")
sh1.Cells(k, "C") = sh1.Cells(i, "C")
sh1.Cells(k, "E") = sh1.Cells(i, "E")
k = k + 1
For j = 2 To d2

If sh2.Cells(j, "J") = "" Then
If sh2.Cells(j, "A") = sh1.Cells(i, "A") Then
If sh2.Cells(j, "C") = sh1.Cells(i, "C") Then

sh1.Cells(k - 1, "E") = sh2.Cells(j, "E")
sh2.Cells(j, "J") = "Y1"
Else
sh1.Cells(k, "A") = sh2.Cells(j, "A")
sh1.Cells(k, "C") = sh2.Cells(j, "C")
sh1.Cells(k, "E") = sh2.Cells(j, "E")
k = k + 1
End If
Else
End If
End If
Next j
Next i
'---
For j = 2 To d2
If sh2.Cells(j, "J") = "Y1" Then
Else
sh1.Cells(k, "A") = sh2.Cells(j, "A")
sh1.Cells(k, "C") = sh2.Cells(j, "C")
sh1.Cells(k, "E") = sh2.Cells(j, "E")
k = k + 1
End If
Next j

End Sub

------前置き終わり--------

今回やりたいのは、これを同ブック内の隣同士のシートではなく、別ブックのシートから情報を拾ってきたいのです。
つまり、
元ブック(このシート上部にマクロ実行ボタンを置きます)の現在のシートにある情報:
ABCDE
ユーザー名電話番号
B川B太0120-002
A山A郎0120-001A市在住
C岡C介0120-003
マクロ実行時にダイアログで指定するブック(シートは最初の1枚だけです)にある情報:
ABCDE
ユーザー名 電話番号項目
F崎F二0120-006
G田G夫0120-007G県GG村
H村H子0120-008
C岡C介0120-003CC村
B川B太0120-002東京都B市


出力結果(元ブックの元シート):
ABCDE
B川B太0120-002東京都B市
A山A郎0120-001A市在住
C岡C介0120-003CC村
F崎F二0120-006
G田G夫0120-007G県GG村
H村H子0120-008


ダイアログを表示させてファイルを選択するのは分かるのですが、その後ファイル同士を読みながら作業を進めるにはどうすればよいでしょうか・・・?
また丸投げですみませんが、なにとぞご教示頂ければと思います。

元のブックの情報と別のブックの情報をマージし、元のブックに上書きする方法を模索しています。

------以下、前置き--------

前回の質問内容:
http://oshiete1.goo.ne.jp/qa5346942.html
にて、シート間でデータを見ながらマージすることはできるようになりました。ありがとうございます。

以下はブック間ではなく、同ブック内の隣のシート間でやりとりする作業をマクロにしたものです。

1枚目のシートにある情報:
ABCDE
ユーザー名電話番号
B川B太0120-002
A山A郎0120-001A市在住
C岡C介01...続きを読む

Aベストアンサー

勉強のためにも直接の回答ではないです。

名前を指定してブックを開く
http://officetanaka.net/excel/vba/file/file02.htm


>Dim sh1 As Worksheet, sh2 As Worksheet
>Set sh1 = Worksheets("Sheet1")
>Set sh2 = Worksheets("Sheet2")

Set sh1 = Workbooks("Book1.xls").Worksheets("Sheet1") 'Book1のSheet1
Set sh2 = Workbooks("Book2.xls").Worksheets("Sheet2") 'Book2のSheet2

とかで出来そうな感じですが、Bookを開いた際の変数を利用してみて下さい。

QマクロとVBAの違いは?

最近officeのVBAを勉強してるのですが「マクロ」と「VBA」って何が違うのでしょうか?

アクセスはマクロとVBA(VBE)が別れてるけど、
エクセルは「マクロの記録」でVBAコードが取得できますよね。

マクロとVBAは同じ意味なのか、違う意味なのか教えていただけますか?

Aベストアンサー

こんにちは。

#2さんの引用先と同じ内容ですが、日本語として出ていたはずです。

マクロとVBAを、一応、定義として把握していないと、きちんと人には教えられないと思いますね。アクセスには、一般的に、VBA側で作られたものは、マクロとは呼べません。

理由は、「マクロ」というのは、その取り扱い言語は別として、ひとつの作業(タスク)の自動実行を目的とする機能のことです。逆にいうと、ひとつの作業を実行できないものは、マクロとは呼びません。例えば、引数を必要とするユーザー定義関数は、マクロの範疇から外れます。

マイクロソフトでは、こう定義しています。

以下は、内容的に、あくまでも、VBAの範疇に対して書かれています。

マクロは、より意味の限定された用語で、引数を持たないパブリックなSub プロシージャのことだけを指します。すべてのマクロはプロシージャですが、すべてのプロシージャがマクロであるとは限りません。マクロの記録機能を使って生成されるプロシージャとOffice アプリケーションの[マクロ]ダイアログボックスから実行できるプロシージャは、すべてマクロです。

それに反して、VBAというのは、アプリケーション用のVisual Basic プログラミング言語です。

「VBA」で書かれたものを総称して、プロシージャと呼び、マクロとは厳密には意味が異なります。また、Ver.4 の「マクロ関数」で書かれたものも、プロシージャで自動実行で作業をするものも、総称してマクロと呼びます。また、ひとつのブックにあるモジュール(=プロシージャを呼び出すためのオブジェクト)群をプロジェクトと呼び、「モジュール」を組み合わせ一貫した仕事をするようにしたものを「システム」と呼んだりします。

これで、違いが分かっていただけたかと思います。

こんにちは。

#2さんの引用先と同じ内容ですが、日本語として出ていたはずです。

マクロとVBAを、一応、定義として把握していないと、きちんと人には教えられないと思いますね。アクセスには、一般的に、VBA側で作られたものは、マクロとは呼べません。

理由は、「マクロ」というのは、その取り扱い言語は別として、ひとつの作業(タスク)の自動実行を目的とする機能のことです。逆にいうと、ひとつの作業を実行できないものは、マクロとは呼びません。例えば、引数を必要とするユーザー定義関数は、マクロの...続きを読む

Qシートにあるキーワードを別のシートで検索し、該当する行(複数行)を新ブックに貼り付けたい

今週から勉強を始めたくらいのマクロ初心者なので言っている事が分かりにくかったらすみません。
エクセルVBAでマクロを組んでいるのですが、
Sheet1にあるキーワード(B3~)をSheet2の指定の列で検索し、
そのキーワードが含まれている行を新しいブックにコピーするものを作成したいです。
どうやっても検索とシートのコピーのところがうまくいかず、Sheet2の行数が2万ぐらいあるのでどの方法で検索をしたらいいのか困っています。
とりあえずブック内にシートを1つ作って、そこにヒットした行を貼り付け新しいブックにコピーすればいいのかと思いやっているのですが、動きません…
以下に現時点でのソースを記載するのでどこがまずいのか助言宜しくお願いします。


Sub kensaku()

Dim key As String
Dim target As String
Dim x As Integer
Dim y As Long
Dim z As Long

x = 3
y = 10
z = 1

Set sh = Worksheets.Add
sh.Name = "kekka"

key = Worksheets("Sheet1").Range("B" & x).Value
Do Until Worksheets("Sheet1").Range("B" & x) = ""
target = Worksheets("Sheet2").Range("F" & y).Value
Do Until Worksheets("Sheet2").Range("F" & y) = ""
If target = key Then
Worksheets("Sheet2").Rows(y).Select
Selection.Copy
Sheets("kekka").Rows(z).Activate
Activesheet.Paste
z = z + 1
End If
y = y + 1
Loop
x = x + 1
Loop

Worksheets("kekka").Copy

Application.DisplayAlerts = False
Worksheets("kekka").Delete
Application.DisplayAlerts = True

End Sub

今週から勉強を始めたくらいのマクロ初心者なので言っている事が分かりにくかったらすみません。
エクセルVBAでマクロを組んでいるのですが、
Sheet1にあるキーワード(B3~)をSheet2の指定の列で検索し、
そのキーワードが含まれている行を新しいブックにコピーするものを作成したいです。
どうやっても検索とシートのコピーのところがうまくいかず、Sheet2の行数が2万ぐらいあるのでどの方法で検索をしたらいいのか困っています。
とりあえずブック内にシートを1つ作って、そこにヒットした行を貼り付け新...続きを読む

Aベストアンサー

>そのキーワードが含まれている行を新しいブックにコピーするものを作成したいです。

オートフィルタでキーワードの文字を絞り込んでから、表の範囲をコピーして別のシートに貼り付けを行う方が簡単で早いですよ。


フィルタで絞り込んでコピーし、別シートに貼り付けと言う作業を記録マクロにして、思い通りに動くように編集してみてはいかがでしょうか?

QVBAとマクロ

お世話になります。田吾作7です。

ふと思ったのですが。。。

VBAとマクロの違いって何でしょう?
「マクロの記録」ボタンを押したのがマクロですか?
VBAは、MS-Officeのモジュールにユーザ自身が書き込んだら、それはVBAですか?
もしそうなら、[マクロの記録]ボタンはなぜ[VisualBasicツールバー]にボタンがあるのでしょうか。マクロを編集しやすくするためでしょうか?

記録で
Range("A1").select
それを編集で
Range("A2").select
としたらVBA?

さらに最初っから
Range("A2").select
と記録したマクロは、やっぱりマクロ?


VBAとマクロって違いあるのでしょうか?
いつも疑問に感じて、モヤモヤしてます。
だれか、このモヤモヤ感を解消してください。

よろしくお願いします。


余談ですが・・・
VBAは[VB for Application]ですよね?
Office関連のためのVBってことですよね。
でもAPIを使ってWINDOWSを制御することもできるから[for App]の意味が無いような気がする今日この頃・・・

お世話になります。田吾作7です。

ふと思ったのですが。。。

VBAとマクロの違いって何でしょう?
「マクロの記録」ボタンを押したのがマクロですか?
VBAは、MS-Officeのモジュールにユーザ自身が書き込んだら、それはVBAですか?
もしそうなら、[マクロの記録]ボタンはなぜ[VisualBasicツールバー]にボタンがあるのでしょうか。マクロを編集しやすくするためでしょうか?

記録で
Range("A1").select
それを編集で
Range("A2").select
としたらVBA?

さらに最初っから
...続きを読む

Aベストアンサー

マクロという言語があるわけではないので
決まった処理を登録しておいて後で実行できる機能を
マクロと呼んでいるんじゃないですか?

そのマクロの情報をスクリプトとして保存しておきますので
そのスクリプトがVBAという事だと思いますが。

QブックAシートAにブックBシートBをコピーしたい

VB.net VB.2008 にてプログラムしています。

ブックAのシートAにブックBのシートBをコピーするには、
どうしたら良いでしょうか?

ブックAシートAには他のシートへの参照が入っています。
ブックBシートBの数値を入れたら、ブックA内の他シートに参照された数値が行き渡るように
したいのですが、行き詰ってます。


 Worksheet.Copy()


だと、Before,Afterの設定になり、そのページズバリにコピーができません。

お知恵をお貸しください。
お願いします。

Aベストアンサー

実際に処理を実行するのは Excel なんだから、Excel VBA の
Copy メソッドのヘルプで確認すればいいじゃない???
Worksheet.Range.Copy(Destination) だよね。Cells で
シートの全セルを対象とした Range を取得するか、使用範囲
のみにするか、そのあたりはお好きなようにどうぞ。

QVBAとマクロの違い

こんばんは。エクセル初心者です。
VBAとマクロの違いについて教えてください。
VBAというのは、プログラミング言語のことで
よろしいのでしょうか?
そのVBAで記述されたものをマクロとよぶ
といったイメージでよろしいのでしょうか?

たとえば、あるエクセルにはいってるマクロを
実行する、ということを作業マニュアルに記述
する場合
「○○マクロを実行する」というのが
正しいのでしょうか?それとも
「VBAを実行する」というのが正しいのでしょうか?

まったく見当違いのご質問だったら申し訳ありません。
教えてください。

Aベストアンサー

「○○マクロを実行する」というほうが正しいです。

VBAは言語のことです。
マクロとは特定の操作手順をプログラムとして記述して自動化することです。

今回の場合、特定の処理なので「マクロ」という表現を使いましょう。

QXL2003:別ブックを検索してデータを拾った後、ヒットしなかったものも別途拾う方法

あるシートにあるデータを別のシートにまとめようとしています。
具体的には、元シートの電話番号をキーに差分シートの電話番号を検索し、ヒットした行の各データを元シートの所定の行に転記するというものです。
元シート・差分シートともに構成は同じです。元シートのC列以外は歯抜けがあることがありますが、キーとなるC列には歯抜けが無く、この列の最後尾をテーブルのEndとして利用することが可能です。

元シート:
C列→ユーザ名
E列→電話番号
G列→項目1
H列→項目2

差分シート:
C列→ユーザ名
E列→電話番号
G列→項目1
H列→項目2

要するにVLOOKUPのような事を行いたいのですが、続きがありまして・・・
"差分シートにある電話番号が元シートに存在しない場合"、検索に引っかからなかったからといって無視せず、その情報もあわせて取り込みたいのです。
取り込み先の列は上記のVLOOKUPに準じます。
ダイアログを開いてファイルを選択させるまではわかるのですが、その後の手順がどうにもさっぱりで・・・

添付ファイルにやりたいことを書いてみました。どなたか手順をご教示いただけませんでしょうか。

あるシートにあるデータを別のシートにまとめようとしています。
具体的には、元シートの電話番号をキーに差分シートの電話番号を検索し、ヒットした行の各データを元シートの所定の行に転記するというものです。
元シート・差分シートともに構成は同じです。元シートのC列以外は歯抜けがあることがありますが、キーとなるC列には歯抜けが無く、この列の最後尾をテーブルのEndとして利用することが可能です。

元シート:
C列→ユーザ名
E列→電話番号
G列→項目1
H列→項目2

差分シート:
C列→ユーザ名...続きを読む

Aベストアンサー

質問には、表題に「VBAで処理したい」ことをはっきり書くこと。
(マクロ実行後を見て始めてそれが判る。VLOOKUPなど出して関数の質問かと誤解する)
ーー
添付画像は、読者・回答者がテストで使えるよう、質問の中にデータを書いておいてほしい。回答の時再入力しないといけないのは、かなわない。
ーー
この質問も、回答者に全てのコードを書いてくれという、丸投げに近いな。
ーーー
これは両データをソートして、マッチングのアルゴリズムでやる問題だが、質問者には説明を要するので、初歩的な蚊mmが得やすいやり方でやってみた。
例データ 以下ーは空白セル(画面で左詰されないようにこの回答だけに入れた)
必要最小限の項目データにしている。多数でテストしてみてください。
Sheet1
ユーザー名-電話番号
a-1
b-2
c-3
Sheet2
ユーザー名-電話番号-項目
c     -4-x
b     -2-y
d     -5-z
e     -6-w
ーー
コード ひょ順モジュールに
Sub test01()
Dim sh1 As Worksheet, sh2 As Worksheet, sh3 As Worksheet
Set sh1 = Worksheets("Sheet1")
Set sh2 = Worksheets("Sheet2")
Set sh3 = Worksheets("Sheet3")
'--
d1 = sh1.Range("a65536").End(xlUp).Row
d2 = sh2.Range("a65536").End(xlUp).Row
'MsgBox d1
'MsgBox d2
k = 2
'---
For i = 2 To d1
sh3.Cells(k, "A") = sh1.Cells(i, "A")
sh3.Cells(k, "C") = sh1.Cells(i, "C")
k = k + 1
For j = 2 To d2
If sh2.Cells(j, "J") = "" Then
If sh2.Cells(j, "A") = sh1.Cells(i, "A") Then
If sh2.Cells(j, "C") = sh1.Cells(i, "C") Then
sh2.Cells(j, "J") = "Y"
Else
sh3.Cells(k, "A") = sh2.Cells(j, "A")
sh3.Cells(k, "C") = sh2.Cells(j, "C")
sh3.Cells(k, "E") = sh2.Cells(j, "E")
k = k + 1
sh2.Cells(j, "J") = "Y"
End If
Else
End If
End If
Next j
Next i
'---
For j = 2 To d2
If sh2.Cells(j, "J") = "Y" Then
Else
sh3.Cells(k, "A") = sh2.Cells(j, "A")
sh3.Cells(k, "C") = sh2.Cells(j, "C")
sh3.Cells(k, "A") = sh2.Cells(j, "A")
sh3.Cells(k, "E") = sh2.Cells(j, "E")
k = k + 1
End If
Next j
End Sub
項目の代入は、手を抜いて、最小限にしてあるので、補ってください。
ーーー
Sheet3
ユーザー名-電話番号-項目
a-1-
b-2-
c-3-
c-4-x
d-5-z
e-6-w

質問には、表題に「VBAで処理したい」ことをはっきり書くこと。
(マクロ実行後を見て始めてそれが判る。VLOOKUPなど出して関数の質問かと誤解する)
ーー
添付画像は、読者・回答者がテストで使えるよう、質問の中にデータを書いておいてほしい。回答の時再入力しないといけないのは、かなわない。
ーー
この質問も、回答者に全てのコードを書いてくれという、丸投げに近いな。
ーーー
これは両データをソートして、マッチングのアルゴリズムでやる問題だが、質問者には説明を要するので、初歩的な蚊mmが...続きを読む

QVBAとマクロの違い

VBA初心者です。
会社の人からVBAとマクロの違いについて質問され、ちゃんと説明できませんでした。
なにがちがうんでしょうか?
私は「VBAのプログラミング=マクロを組む」と思ってました。
よろしくお願いします。

Aベストアンサー

こんにちは。maruru01です。

Excel(2000)については、No.1の方の説明通り、
「マクロ = VBAというプログラミング言語で記述された一塊の動作」
です。
したがって、miyacさんの、
「VBAのプログラミング=マクロを組む」
で、おおよそあっています。
また、自分で書いたコードをマクロとして登録することも出来ます。
しかし、Access(2000)での"マクロ"は少しニュアンスが異なります。
Accessの場合は、マクロはいくつかの動作・操作は順に登録しておき、それを自動実行させる、という使い方です。自分で書いたコードをマクロとして登録するというやり方ではありません。(本当はそういうやり方も出来ますが。)
したがって、VBAとマクロは何となく別物のような印象を受けます。
それにAccessでは、「マクロを組む」という表現は通常使いません。
ただし、マクロをVBAに変換することが出来ますし、マクロに登録する各動作・操作も、VBAで自分で書くことが出来ます。
ですから、結局同じことなんですけどね。
まとめると、「マクロは自動実行処理を登録すること」で、「VBAはそのアプリケーションのあらゆる操作を記述すること」ですかね。
では。

こんにちは。maruru01です。

Excel(2000)については、No.1の方の説明通り、
「マクロ = VBAというプログラミング言語で記述された一塊の動作」
です。
したがって、miyacさんの、
「VBAのプログラミング=マクロを組む」
で、おおよそあっています。
また、自分で書いたコードをマクロとして登録することも出来ます。
しかし、Access(2000)での"マクロ"は少しニュアンスが異なります。
Accessの場合は、マクロはいくつかの動作・操作は順に登録しておき、それを自動実行させる、という使い方です。...続きを読む

Q1フォルダに「A.xls」、「B.xls」、「C.xls」・・・とある

1フォルダに「A.xls」、「B.xls」、「C.xls」・・・とある場合、
すべてのファイルに一斉にA1セルに「a」という文字を反映させる場合の
VBAプログラムを教えていただけますでしょうか?
よろしくお願いいたします。

Aベストアンサー

フォルダ名を変更してから試してね
4行目の
mPath = "C:\tmp\"
「aaa」なら
mPath = "C:\aaa\"
に変更


Sub test()
Dim mPath As String
Dim nf As String
mPath = "C:\tmp\"
nf = Dir(mPath & ".xls")
Do While nf <> ""
Workbooks.Open Filename:=mPath & nf
Workbooks(nf).ActiveSheet.Range("a1").Value = "a"
Workbooks(nf).Close SaveChanges:=False
nf = Dir()
Loop
End Sub

簡単なコードにしてあるので、分らない所はヘルプで調べてね
参考まで


人気Q&Aランキング

おすすめ情報