ネットが遅くてイライラしてない!?

お世話になっております。
下記の様な表がシート1とシート2に有、
シート2がシート1と比較して、行が多かったり、または
数量だけが変わっていたり、行が減っていたり、
表の行数は100から200行くらいあるので、VBAでどこが
違うかをすぐ分かる様に確認したいと思っています。
下記の表はあくまでも例ですが、実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。
どの様に記述していいか分からなく、ご教示下さいます様宜しくお願い致します。

   記

A列  B列  C列   D列   E列   
No  品番  品名   地区   数量 
236  A6TET  みかん  市川   3本
248  A7TGR  りんご  松戸   5本
273  B9GKT  ぶどう  柏    14本
273  A8UFE  すいか  行徳   6本   
381  C2ROF  いちご  平井   22本

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

A 回答 (4件)

どういう条件の行があって、何をもってその行が「同じ/違う」とするか?という仕様によると思いますが、


仮に、ABCD列が全て同じものを「同一」とし、同シートに前述定義の「同一」が無いと仮定すれば、

Set s1 = Sheets("Sheet1").Range("A1").CurrentRegion
Set s2 = Sheets("Sheet2").Range("A1").CurrentRegion
n = 10
For i = 2 To s1.Rows.Count
s1.Cells(i, 6) = ""
Next
For j = 2 To s2.Rows.Count
s2.Cells(j, 6) = ""
Next
For i = 2 To s1.Rows.Count
judge = 0
For j = 2 To s2.Rows.Count
If s1.Cells(i, 1) = s2.Cells(j, 1) And _
s1.Cells(i, 2) = s2.Cells(j, 2) And _
s1.Cells(i, 3) = s2.Cells(j, 3) And _
s1.Cells(i, 4) = s2.Cells(j, 4) Then
judge = 1
If s1.Cells(i, 5) = s2.Cells(j, 5) Then
s2.Cells(j, 6) = "Sheet1と同じ" '同一
Else
s2.Cells(j, 6) = "Sheet1と本数以外同じ" '本数変更
End If
End If
Next
If judge = 0 Then
s1.Cells(i, 6) = "Sheet1にしかない" '削除
End If
Next
For j = 2 To s2.Rows.Count
If s2.Cells(j, 6) = "" Then
s2.Cells(j, 6) = "Sheet2にしかない" '追加
End If
Next

順次比較でスマートではありませんが
    • good
    • 0
この回答へのお礼

分かりにくい質問でしたのに、ありがとうございます。
やはり主キーをABCD列まとめる事になると何となく思っていましたが、そのVBAの記述が分かりませんでした。
ありがとうございました。

お礼日時:2008/08/24 23:53

2つの表を通して、同一と判断できる項目は何ですか。

2つが同一と判断できて、その後その属性項目について、比較してこそ意味があるのです。人事ファイルでは職員コードです。主キーに当たるものです。
上記例は実際世界ー>模擬例に移し変えてあるようですが、品番がそれに当たるのかな。品名は品番が決まれば1意に決まる(従属している)ものでしょう。そういう点から、A列とB列の関係が良くわからない。
こういうことを意識しないうちは、質問のような課題を自力でやるのは無理です。VBAは経験あるのでしょうか。質問課題は中級の上ぐらいのスキルがいると思います。本件課題の丸投げで、コードをマルマル書いてくださいという状態です。このコーナーの規約上望ましくないタイプです。
人間がエクセルを使って手作業でやる場合は、どういう作業をすればよいのか、事細かに考えて、まず文章で、文章化するとVBAの場合も参考になります。
ーー
ロジックとしては1方のシートの主キーを元に、他シートの同一キーを捜し(総なめ法)、一致したものが見つかれば、比較作業に入る
方法があります。
ーー
その場合データを主キーでソーとしてあれば、見つかった後の塊以外は該当が無いので、ロジックが組みやすいです。
ーー
私なら両シートを主キーでソートして、ファイル・マッチングのロジックで主キーの同じレコード(行)を見つけ、対比して、差異を見つけます。
その場合1対1または1対多が望ましいが、多対多だとどれを基準に
正しいとしてよいか分からなくなります。
シート1で主キーについて誤りダブりが無いように、第1ステップの作業が必要かもしれません。
ーーー
誤り事由の、ありそうなパターンを、文章で書き上げてみるのも非常に大切だと思います。
(主キー、ファイル・マッチングはWEB照会のこと)
http://e-words.jp/w/E4B8BBE382ADE383BC.html
マッチングの法は語句(文字列)マッチングの記事が多いので注意。
本件はファイルのマッチンヅの方です。
http://dospara.okwave.jp/qa3419667.html?ans_coun …
のNo.2
    • good
    • 0

ANo.1です。



例えば、
>実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。
この場合だと”地区”が変われば抽出と言う事ですか?

比較するには変化のない部分と変化する部分があって出来ると思います。
この表の場合品番と品名が必ず組み合わさっているとか、品番と地区が
組になっているとか、そう言う情報が読み取れません。
ですので、憶測でのコード化も難しいと思ってはいます。
(出来る方はいらっしゃるかも知れませんが。)

或いはテキストファイルにして、差分抽出を行なうのがいいのかは
実際のファイルがないので不明ですが。
検索:テキストファイル 差分抽出
http://www.google.co.jp/search?sourceid=navclien …
有効かどうかは検証できないので無理であればスル~して下さい。
    • good
    • 0

>下記の表はあくまでも例ですが、実際は同じNO・同じ品番・同じ品名・同じ数量で複数行あったりします。


どのような表とどのような表を比較した際に、どのような結果を求めているのか、
補足が必要な感じがします。
例を元にコード化したあとでご自身で変更が可能であれば別ですが、
何をコード化すべきか回答する側も憶測でしか出来ないように思います。

比較する際に基準にするものが、A列だけとか複数列とかも合わせて
提示してみたら回答がつくかも知れません。

この回答への補足

早期なご回答ありがとうございます。
すみません。わかりずらいと思います。
そのものの表を提示する訳にはいかず、説明も分かりずらいかも知れません。
表は、ある情報を元に、毎日更新され、それを日ごとにシートを分けて管理してます。
比較する表の形式や内容は、ほとんど同じ物の表で、それが前日の表より、どこか1行増えていたりするのを何百行ある内から探すのが大変なので、VBAでどこが変化したか確認したく検討しています。その変化の内容は行が増えるだけなら単純なのですが、行は増えずに、数量だけが変わっていたりします。(例えば、上記表の中のNO248の5本だったのが、次の日みたら、7本に変わっていたりとかです。)
あくまでも表が例ですので、当然自身でコード変更は必要になると思っております。
もしこれで宜しければご回答頂きたいと思います。
尚、補足は随時行いたいと思います。

補足日時:2008/08/24 09:34
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QExcelで[表1]にあって、[表2]にないものを抽出する関数

Excelで[表1]にあって、[表2]にないものを抽出する関数

例)[表1]   [表2]
   A社     A社
   D社     D社
   R社     P社
   P社     R社
   D社
   F社
   F社

上記は簡単に書きましたが、表1に重複するものも含め、300社程度あるなかで
表2にリストアップされていない会社を見つける関数やその他方法論があれば
ぜひ教えてください!
(例でいえば、F社を見つける方法です。)

抽出するのは別シートでも、同じシートでも構いません。

Excel2003でも対応できるものであれば、なお嬉しいです。

よろしくお願いします。

Aベストアンサー

Countif関数で同じものがいくつあるか数えさせます。
   A   B        C
  [表1]表2にある数   [表2]
   A社          A社
   D社          D社
   R社          P社
   P社          R社
   D社
   F社
   F社
だとして
B列に =Countif(C:C,A2)
と入れて下までコピィすれば 表2に同じものがいくつあるか出ますので
0 がないものです。

QExcelファイルを比較し、差分箇所に色をつけるには?

VBA初心者です。
突如作成を依頼されてしまいました。
どなたかお手すきでしたら、よろしくお願いします。


まず2つのフォルダA(新しいデータのExcelファイル)、
フォルダB(古いデータのExcelファイル)があります。

それぞれには同じ名前のExcelファイルが200個近く入っているのですが、
新旧同じ名前同士のファイルを比較し、差分箇所に色をつけるという
作業をしたいのです。(新旧のファイルどちらにも色を付ける)

できればフォルダAとフォルダBを選択したら勝手に処理してくれるという
プログラムにしたいのですが、どのようにしたらよろしいでしょうか。

数値の比較ですが、範囲を指定してマッチしてなければ色付け、という
処理でもいいかな・・と思っております。

どうかよろしくお願いします。

Aベストアンサー

こんなのではどうでしょうか?

両フォルダには同じ名前のExcelファイル(各シート数も同じ)があるとして、片方からだけ見てます。
同名のブックを開けないので作業フォルダに別名でコピーして作業をして戻してます。(これが結構長くしてる)
Const workFolder ="???"を適当に設定してください。
シートのチェックはUsedRange内のチェックをしてます。
さすがにこれは片方からだけとはいかないので両方からチェックしてます。
当然ダブってチェックする部分がほとんどですが・・・処理が長くなりそうなのでダブり部分のチェックはしません。
かわりに作業の進行状況をステータスバーに表示しますので、シートにボタンを作って、ボタンのクリックからsampleを呼んでみてください。

Option Explicit
Const workFolder = "c:\temp" '適当な作業フォルダを設定してください。
Sub sample()
Dim srcFolder As String
Dim dstFolder As String
srcFolder = "c:\test\a" 'フォルダA
dstFolder = "c:\test\b" 'フォルダB

Dim fso As New FileSystemObject
Dim srcFile As String
Dim dstFile As String
Dim srcWorkFile As String
Dim dstWorkFile As String
Dim f As File
Dim n As Integer '進行状況表示用
Dim i As Integer '進行状況表示用
'表示設定
Application.DisplayStatusBar = True 'ステータスバー表示
Application.ScreenUpdating = False '画面更新禁止
'作業ファイル名
srcWorkFile = workFolder & "\src.xls"
dstWorkFile = workFolder & "\dst.xls"
n = fso.GetFolder(srcFolder).Files.Count
For Each f In fso.GetFolder(srcFolder).Files
i = i + 1
If f Like "*.xls" Then
'srcFolderのファイルと同じ名前のファイルがdstFolderにもあるとする
srcFile = srcFolder & "\" & f.Name
dstFile = dstFolder & "\" & f.Name
'ステータスバー表示
Application.StatusBar = srcFile & " と " & dstFile & " を、チェック中 (" & i & "/" & n & ")"
'作業フォルダにファイルをコピー
fso.CopyFile srcFile, srcWorkFile, True
fso.CopyFile dstFile, dstWorkFile, True
'ブックチェック
checkBook srcWorkFile, dstWorkFile
'作業フォルダのファイルを戻す
fso.CopyFile srcWorkFile, srcFile, True
fso.CopyFile dstWorkFile, dstFile, True
End If
Next
'作業ファイルを削除
fso.DeleteFile srcWorkFile
fso.DeleteFile dstWorkFile
'後始末
Set fso = Nothing
Application.ScreenUpdating = True
Application.StatusBar = False
End Sub
'ブック(ファイル)のチェック
Sub checkBook(srcFile As String, dstFile As String)
Dim srcBook As Workbook
Dim dstBook As Workbook
Dim ws As Worksheet
Set srcBook = Workbooks.Open(srcFile)
Set dstBook = Workbooks.Open(dstFile)
'srcBookのシート名と同じシートがdstBookにもあるとしてチェック
For Each ws In srcBook.Worksheets
checkSheet ws, dstBook.Worksheets(ws.Name)
Next
srcBook.Close savechanges:=True
dstBook.Close savechanges:=True
End Sub
'シートのチェック
Sub checkSheet(srcSheet As Worksheet, dstSheet As Worksheet)
'背景色のクリア
srcSheet.Cells.Interior.ColorIndex = xlNone
dstSheet.Cells.Interior.ColorIndex = xlNone
'両方のUsedRange範囲内で変更点をチェック
'ダブってチェックする部分が多いけれど
checkSheetUsedRange srcSheet, dstSheet
checkSheetUsedRange dstSheet, srcSheet
End Sub
'シートのチェック(srcSheetのUsedRange内)
Sub checkSheetUsedRange(srcSheet As Worksheet, dstSheet As Worksheet)
Dim r As Range
For Each r In srcSheet.UsedRange
If r <> dstSheet.Range(r.Address) Then
r.Interior.ColorIndex = 3
dstSheet.Range(r.Address).Interior.ColorIndex = 3
End If
Next
End Sub

こんなのではどうでしょうか?

両フォルダには同じ名前のExcelファイル(各シート数も同じ)があるとして、片方からだけ見てます。
同名のブックを開けないので作業フォルダに別名でコピーして作業をして戻してます。(これが結構長くしてる)
Const workFolder ="???"を適当に設定してください。
シートのチェックはUsedRange内のチェックをしてます。
さすがにこれは片方からだけとはいかないので両方からチェックしてます。
当然ダブってチェックする部分がほとんどですが・・・処理が長くなりそうなの...続きを読む

QエクセルでA列とB列の差分を抽出

エクセルでA列にはあるがB列にはない項目を抽出するにはどうしたらよいでしょうか。
下の例だと、C列あたりに、山本、川田を抽出したいのですが……
A列にはB列のデータがすべて含まれています。
A列は10月と11月のデータで、B列は10月のデータです。

A列   B列
山田  山田
山本  川上
川田
川上

Aベストアンサー

色々な方法がありますが、COUNTIF関数とIF関数で、一致するものしないものが選択できそうですね。
データがA1:A4、B1:B2にあるとします。
C列に
=IF(COUNTIF($B$1:$B$2,A1)=0,A1,"")
と入力すれば、A1の値がB列の範囲内になければ、A1を表示、ない場合には何も表示しません。
ご確認下さい。

QExcelで2つのファイルの違い(Diff)をとりたい

Excelでファイル名が同じで更新日付の異なる2つのファイルがあります。
この2つのファイルで内容が変わっている部分を知りたいのですが、良い方法はあるでしょうか?
(もしくは内容が変わっているかどうかだけでも知りたい)

比較が必要なファイルが大量にあるため、一つずつ見比べる時間が無く、困っています。

Aベストアンサー

使ってないのでお勧めはわかりませんが、こちらのフリーソフトを試してみては?
http://search.vector.co.jp/search?query=excel+%94%E4%8Ar

QExel VBA 別ブックから該当データを検索し、必要なデータを取得する方法について

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数ではなく、マクロで処理を希望します。

自分では、部品表の商品番号をコピーして、コード一覧表で検索し、検索結果の右隣のセル(B列のコード)の値を部品表のC列に貼り付ければよいかと思い、書いてみたんですが…

Sub 別ブックから貼り付ける()
  Dim 検索する As Long
Windows("部品表.xls").Activate
検索する = cells(i,2).Value
Windows("コード一覧表.xls").Activate
ActiveWindow.SmallScroll Down:=-3
Selection.AutoFilter Field:=3, Criteria1:="=検索する", Operator:= xlAnd

と、してみたものの、検索しても、その検索結果の隣のセルのコードをどうやって取得すればいいのかが、わかりませんでした。

基本事項は本で学びましたが、呪文のようなコードはよく理解できません。懸命にネットで検索して、訳して理解する努力をしてはいますが。

どうぞよろしくお願いします。

部品表というブックがあります
A列に商品名、B列に商品番号が入力してあります。C列のコードは未入力です。
A列     B列     C列      
商品名  商品番号  コード
モータ  U-1325-L  
ホルダ  R-134256

また、コード一覧表という別のブックには、A列に商品番号と、B列にコードが、何千件も入力されています。

やりたいことは
部品表のC列のコード欄に、コード一覧表ブックから商品番号と一致するコードを貼り付けしたいのです。

部品表は、何百種類もありますので、関数...続きを読む

Aベストアンサー

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks.Open("C:\★★\コード一覧表.xls") '★要変更★
 I = 2
 Do While Range("A" & I).Value <> ""
  ThisWorkbook.Worksheets("Sheet1").Range("C" & I).Value = Application.VLookup(ThisWorkbook.Worksheets("Sheet1").Range("B" & I).Value, xlBook.Worksheets("Sheet1").Range("A2:B65535"), 2, 0)
  I = I + 1
 Loop
 xlBook.Close
 Application.ScreenUpdating = True
 MsgBox ("完了")
End Sub

こんにちは。
とりあえず実用性も踏まえました。
メインの動作はワークシート関数のVLOOKUPをVBA上で使用していますので理解はしやすいかと思います。
また、質問文から察するに「部品表.xls」と「コード一覧表.xls」の両方を開いて処理されていますが「コード一覧表.xls」はプログラム内で開いて閉じているので実行するときは「コード一覧表.xls」は閉じて置いてください。
Option Explicit
Sub Sample()
 Application.ScreenUpdating = False
 Dim I As Long
 Dim xlBook
 Set xlBook = Workbooks....続きを読む

QEXCEL VBA で現在開いているブックのファイル名を取得する方法

EXCEL2003 VBAで業務を簡素化するために、現在開いているブックのファイル名を取得する方法が分かりません。
作業手順をマクロを使って処理していますが、オリジナルのワークブックをファイル名を変えて保存し、以後、このワークブックを読み込んで使用しています。
このときのVBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり、以後の業務に使用できません。
常にファイル名を取得出来るVBAをどなたか、教えて下さい。

Aベストアンサー

>現在開いているブックのファイル名
 ちょっと曖昧な表現かなぁという気もいたしますが、VBAが書いてあるブックのブック名は
ThisWorkbook.Name
で、現在 "アクティブにして" 操作対象になっているブックの名前は
ActiveWorkbook.Name
ですね。

 しかし、
>VBAは、オリジナルのファイル名を使っているため、ファイル名を変更するとエラーになり
というような文脈からすると、
ThisWorkbook.Name
の方ですかね。

Q[初心者です]VBAで指定列からAを検索し、発見したら隣のセルに値0を入れるマクロ。

VBAで指定列からAを検索し、発見したら隣のセルに0を入れるマクロを組みたいのですが、組み方がVBA初心者の為わかりません。
(例)
L列に、A、B、C、D、E、Fとランダムに文字が入っていて、
文字Aを検索し、発見したら隣のI列に値0を入れるというマクロです。

Sub Search()
Dim A As String
Set A = Worksheets("Sheet1").Cells.Find("A")
If A Is Nothing Then
ActiveCell.Offset(0, 1).Value = 0

End If
End Sub
と過去の質問で考えてみたのですが、Aがあった時、、、、
とコードが書けないです。
大変困っているので、ご教授頂けないでしょうか?
出来れば、そのままマクロに出来るコードを教えて頂けないでしょうか?
宜しくお願い致します。

Aベストアンサー

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表格が、この「Find」 です。

>Set A = Worksheets("Sheet1").Cells.Find("A")

>過去の質問で考えてみたのです

どうも、Find メソッドは、あるレベル以下の人は、省略する傾向があるようです。何が大事で、何が大事でないかというのは、やってみなければ分かりませんが、検索語だけを入れる書き方は、実務では、あまりしないほうがよいと思います。

だいたい、以下のTestFind2 ぐらいまでに、省略は、とどめたほうがよいです。

それは、Find は、必ずしも自分が思っているデフォルトとは違うことがあるので、「明示的(意図的に)」にオプションは入れたほうがよいです。
例えば、大文字小文字の違いを付けるなら、MatchCase:=True, 数式まで探すなら、LookIn:=xlFormulas

なお、Find メソッドは、5年経っても、たぶん完全に覚えられません。面倒なコードのひとつです。ですが、これはパターンが決まっているので、ひとつパターンが決まったら、それに当てはめればよいだけです。

#3さんで示されているMougのサンプルコードと似てはいるのですが、Mougのサンプルコードでは、Verionによって、失敗することがあります。

'--------------------------------------
'記録マクロをそのまま使う方法
Sub TestFind1()
Dim c As Range
 Set c = Columns("L:L").Find(What:="A", _
           After:=ActiveCell, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           SearchOrder:=xlByRows, _
           SearchDirection:=xlNext, _
           MatchCase:=False, _
           MatchByte:=False, _
           SearchFormat:=False)
 c.Offset(0, 1).Value = 0
End Sub
'--------------------------------------
'TestFind1 をアレンジしてみる
Sub TestFind2()
Dim c As Range
'検索語
Const MYTXT As String = "A"
 Set c = ActiveSheet.Columns("L:L").Find(What:=MYTXT, _
           LookIn:=xlValues, _
           LookAt:=xlPart, _
           MatchCase:=False)
 If Not c Is Nothing Then
    c.Offset(0, 1).Value = 0
 End If
End Sub

'---------------------------------------
'複数ある場合(パターンを使った方法)
'---------------------------------------
Sub TestFind3()
  Dim c As Range
  Dim FirstAdd As String
  Const MYTXT As String = "A"
  Set c = ActiveSheet.Columns("L:L").Find( _
    What:=MYTXT, _
    LookIn:=xlValues, _
    LookAt:=xlPart, _
    MatchCase:=False)
  
  If Not c Is Nothing Then
    FirstAdd = c.Address
    Do
      c.Offset(, 1).Value = 0
      Set c = ActiveSheet.Columns("L:L").FindNext(c)
      If c.Address = FirstAdd Then Exit Sub
    Loop Until c Is Nothing
  End If
End Sub

こんばんは。

#3さんのおっしゃっていることも、もっともなのですが、気になる点がありましたので、自分のことを踏まえて、書かせていただきます。

いずれ、また、同じようなケースが出会うと思います。こんな原則を考えてみたらどうでしょうか?それは、私も自身も同じなのですが、ワークシートのコマンドで行われるものは、記録マクロから作ってみるということです。他にも、「統合」とか、「置換」とか「オートフィルタ」「フィルタオプション」とかは、みんなパターンが決まっています。
その中の代表...続きを読む

QEXCEL VBAマクロ作成で、他のEXCELからデータを取り込みたい

メインプログラム(EXCEL VBA)より、
他のフォルダーにあるEXCELの項目の内容を取り込みたいです。
たとえば他のフォルダーのEXCELのRange("A2:A3").ValueをメインプログラムのRange("C2:C3").Valueにセットしたい時です。

・コマンドボタン押したら、どこのEXCELから取り込むかのポップアップ(?)は、表示はできてます。
・作業者が選んだパスとブックもMsgBoxで表示できてるので、もらう相手の場所も取得できてます。

・となると次はOPEN,INPUTですか?
テキストデータの取り込みですと、Inputでそのバッファを定義してるのですが、なんか違うような。。。

よろしくお願いします!

Aベストアンサー

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Cells(2, 2).Value ' 相手シートの B2 の値を自分自身の A1 に書き込む

readBook.Close False ' 相手ブックを閉じる
Set readSheet = Nothing
Set readBook = Nothing

私がやる方法です。

Dim writeSheet As Worksheet ' 自分自身の書き出し先シート
Set writeSheet = ThisWorkbook.Worksheets(1) ' Sheet1 を参照

Dim readBook As Workbook ' 相手ブック
Set readBook = Workbooks.Open(filename) ' 相手ブックを開いて参照
Dim readSheet As WorkSheet ' 相手シート
Set readSheet = readBook.Worksheets("sheetName") ' 相手シートを参照
' または Set readSheet = readBook.Worksheets(sheetIndex)

' 例えば
writeSheet.Cells(1, 1).Value = readSheet.Ce...続きを読む

Q別のシートから値を取得するとき

Worksheets("シート名").Activate
上記のを行ってから別シートの値を取得するのですが、
この処理を行うと指定したシートへ強制的にとんでしまいます。。。

※イメージ
For ~ To ~
  Worksheets("シートA").Activate
  シートAの値取得
       :
  Worksheets("シートB").Activate
  シートBの値取得
Next

このイメージ処理を行うとものすごい勢いで画面がチカチカします。。。
シートを変えずに他のシートから値を取得する方法はないのでしょうか。
教えてください!

Aベストアンサー

Worksheets("シートA").Range("A1")

みたいな感じでできませんか?

Qある範囲のセルから任意の値を検索して、その隣のセルの値を取得するという関数はありますか?

Excelの関数について質問します。
ある範囲のせるを検索して、その隣のセルの値を取得するという関数を探しています。
なければユーザー定義で作りたいと思っています。
VLOOKUP関数では一番左端が検索されますが、
それをある範囲まで拡張して、
その右隣の値を取得できるようにしたいのです。
どうかお知恵をお貸しください。

Aベストアンサー

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場合によっては、IFをかぶせてCOUNTIFで確認した方が良いかもしれません。
 ex. =IF(COUNTIF(A1:F200,X1)=1,【上記数式】,"えらー")

ちなみに、VBAでやるならこんな感じになるかと。

動作の概要
 【検査範囲】から【検査値】を探し、
 最初にHITしたセルについて、右隣のセルの値を返す。
 ex. =Sample(X1,A1:F200)

'--------------------------↓ココカラ↓--------------------------
Function Sample(ByVal 検査値 As Variant,ByVal 検査範囲 As Range)
 For Each セル In 検査範囲
  If セル = 検査値 Then Exit For
 Next セル
 Sample = セル.Offset(0, 1)
End Function
'--------------------------↑ココマデ↑--------------------------

いずれもExcel2003で動作確認済。
以上ご参考まで。

●X1セルの値を範囲A1:F200の中から探して、その右隣のセルの値を返す

 =OFFSET(A1,SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1))-1,SUMPRODUCT(COLUMN(A1:F200)*(A1:F200=X1)))

※最初のA1はワークシートの左上隅を示すものなので、検索範囲に関わらずA1固定
※SUMPRODUCT(ROW(A1:F200)*(A1:F200=X1)) ⇒ A1:F200で値がX1と一致するセルの行番号

>その「ある範囲」の中には検索したい値が入っているセルは1つしかありません。
というのが前提です。複数のセルがHITすると関係ないセルの値が返るので、
場...続きを読む


人気Q&Aランキング