• ベストアンサー

合計一覧より参照 表記excel2007VBA

シート1に各月の売上一覧が毎月更新されていきます。 シート2のC1に ○月売上を指定し、B列に表記したいと考えています。 よろしくお願いします。

  • musti
  • お礼率54% (33/61)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.3

> 例えば、1月売上→2016/1/20 と直した場合 Sheet1,Sheet2のどちらを直したのかわからないので、3パターン記載しておきます。 'Sheet2もSheet1も2016/2/20など同じ日付 Sub Example() Dim MyColumn As Long Dim ws1 As Worksheet, ws2 As Worksheet On Error Resume Next Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") MyColumn = WorksheetFunction.Match(ws2.Range("C1").Value2, ws1.Range("1:1"), 0) '↑もしくはws2.Range("C1").Value2をws2.Range("C1")に ws1.Cells(1, MyColumn).Resize(11, 1).Copy ws2.Range("B1") Set ws1 = Nothing Set ws2 = Nothing End Sub 'Sheet2が○月売上Sheet1が2016/2/20など日付 Sub Example2() Dim MyLastColumn As Long Dim ws1 As Worksheet, ws2 As Worksheet Dim SearchStr As String Dim c As Range Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") SearchStr = Left(ws2.Range("C1").Value, InStr(ws2.Range("C1").Value, "月") - 1) 'Sheet2が2016/2/20など日付Sheet1が○月売上の場合は 'SearchStr = Month(ws2.Range("C1").Value) & "月売上" With ws1 MyLastColumn = .Cells(1, Columns.Count).End(xlToLeft).Column For Each c In .Range(.Cells(1, "B"), .Cells(1, MyLastColumn)) If Month(c.Value) = SearchStr Then 'Sheet2が2016/2/20など日付Sheet1が○月売上の場合は 'If c.Value = SearchStr Then .Cells(1, c.Column).Resize(11, 1).Copy ws2.Range("B1") Exit For End If Next End With Set ws1 = Nothing Set ws2 = Nothing End Sub

musti
質問者

お礼

1パターンでさせて頂きました! ご丁寧にありがとうございます。

その他の回答 (5)

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.6

>シート2の”C”列と順に転記されていく方法なんですね。  その通りです。 >”C1”の値を”シート1”からB列に読み込むだけでよかったのですが、  済みません。「シート1”からB列に読み込むだけ」ならばC1セルではなくB1セルに値を入力しておいて、2行目以下の値だけを転記させれば良い様に思えたため、 >B列に表記したい と書いておられるのにも関わらず、 >シート2のC1に となっているのは単なる入力ミスの類だと思い込んでおりました。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.5

 回答No.2,4です。  回答No.4を回答した時には、自分の回答に対して投稿されて来たお礼コメントしか読んでいなかったのですが、 >例えば、1月売上→2016/1/20 と直した場合、VBA表記されなくなってしまいました…。 という問題もあったのですね。  それでその場合、「2016/1/20」に直したというお話は、Sheet1とSheet2のそれぞれに1枚ずつ設けられている表の、両方の1行目の値を直したという事であると考えて宜しいのでしょうか?  「片方だけが『2016/1/20』に直されていて、もう一方は『1月売上』のままである」という訳ではないと考えて宜しいのでしょうか?  もし両方の表において1行目の値が「2016/1/20」などの様になっている場合には、一例としては次の様なVBAのマクロになります。 Sub QNo9219574_合計一覧より参照_表記excel2007VBA_改() Dim i As Long, c As Range, SheetName(1, 1) As String, MySheet(1) As Worksheet, _ ItemRow(1) As Long, ItemColumn(1) As String, myColumns As Long, _ myRows As Long, LastRow As Long, LastColumn As Long, buf As Variant SheetName(0, 0) = "Sheet1" '元データの表が存在するシートのシート名 SheetName(0, 1) = "元データが入力されている" '元データの表が存在するシートの説明文 SheetName(1, 0) = "Sheet2" '新たに表を作成するシートのシート名 SheetName(1, 1) = "データの転写先" '新たに表を作成するシートの説明文 ItemRow(0) = 1 '元データの表において項目名が入力されている行 ItemRow(1) = 1 '新たに作成する表において項目名が入力されている行 ItemColumn(0) = "A" '元データの表において顧客名が入力されている列 ItemColumn(1) = "A" '新たに作成する表において顧客名が入力されている列 For i = 0 To 1 If IsError(Evaluate("ROW('" & SheetName(i, 0) & "'!A1)")) Then MsgBox SheetName(i, 1) & "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & SheetName(i, 0) & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set MySheet(i) = Sheets(SheetName(i, 0)) Next i For i = 0 To 1 With MySheet(i) LastRow = .Range(ItemColumn(i) & Rows.Count).End(xlUp).row LastColumn = .Cells(ItemRow(i), Columns.Count).End(xlToLeft).column If LastRow <= ItemRow(i) Or LastColumn <= .Columns(ItemColumn(i)).column Then MsgBox "処理すべき元データが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If End With Next i myRows = LastRow - ItemRow(1) myColumns = LastColumn - MySheet(1).Columns(ItemColumn(1)).column With Application .ScreenUpdating = False .Calculation = xlManual End With MySheet(1).Range(ItemColumn(1) & ItemRow(1)).Offset(1, 1) _ .Resize(myRows, myColumns).ClearContents For Each c In MySheet(1).Range(ItemColumn(1) & ItemRow(1)).Offset(0, 1).Resize(1, myColumns) buf = c.Value If buf <> "" And WorksheetFunction.CountIf(MySheet(0).Range( _ ItemColumn(0) & ItemRow(0)).Offset(0.1).Resize(1, 12), buf) > 0 Then If IsDate(buf) Then buf = CDbl(buf) c.Offset(1).Resize(myRows).Value = MySheet(0).Cells(ItemRow(0), WorksheetFunction _ .Match(buf, MySheet(0).Rows(ItemRow(0)), 0)).Offset(1).Resize(myRows).Value End If Next c With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.4

 回答No.2です。 >中程の GoTo labelE でエラーになってしまいます。  失礼しました。回答欄に入力する際に GoTo labelE を使わない方法に修正しようとしたのですが、消し忘れた GoTo labelE がまだ残っておりました。  その GoTo labelE の所を Exit Sub に差し換えて下さい。 Sub QNo9219574_合計一覧より参照_表記excel2007VBA() Dim i As Long, c As Range, SheetName(1, 1) As String, MySheet(1) As Worksheet, _ ItemRow(1) As Long, ItemColumn(1) As String, myColumns As Long, _ myRows As Long, LastRow As Long, LastColumn As Long SheetName(0, 0) = "Sheet1" '元データの表が存在するシートのシート名 SheetName(0, 1) = "元データが入力されている" '元データの表が存在するシートの説明文 SheetName(1, 0) = "Sheet2" '新たに表を作成するシートのシート名 SheetName(1, 1) = "データの転写先" '新たに表を作成するシートの説明文 ItemRow(0) = 1 '元データの表において項目名が入力されている行 ItemRow(1) = 1 '新たに作成する表において項目名が入力されている行 ItemColumn(0) = "A" '元データの表において顧客名が入力されている列 ItemColumn(1) = "A" '新たに作成する表において顧客名が入力されている列 For i = 0 To 1 If IsError(Evaluate("ROW('" & SheetName(i, 0) & "'!A1)")) Then MsgBox SheetName(i, 1) & "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & SheetName(i, 0) & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" Exit Sub End If Set MySheet(i) = Sheets(SheetName(i, 0)) Next i For i = 0 To 1 With MySheet(i) LastRow = .Range(ItemColumn(i) & Rows.Count).End(xlUp).row LastColumn = .Cells(ItemRow(i), Columns.Count).End(xlToLeft).column If LastRow <= ItemRow(i) Or LastColumn <= .Columns(ItemColumn(i)).column Then MsgBox "処理すべき元データが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If End With Next i myRows = LastRow - ItemRow(1) myColumns = LastColumn - MySheet(1).Columns(ItemColumn(1)).column With Application .ScreenUpdating = False .Calculation = xlManual End With MySheet(1).Range(ItemColumn(1) & ItemRow(1)).Offset(1, 1) _ .Resize(myRows, myColumns).ClearContents For Each c In MySheet(1).Range(ItemColumn(1) & ItemRow(1)).Offset(0, 1).Resize(1, myColumns) If c.Value <> "" And WorksheetFunction.CountIf(MySheet(0).Range( _ ItemColumn(0) & ItemRow(0)).Offset(0.1).Resize(1, 12), c.Value) > 0 Then c.Offset(1).Resize(myRows).Value = MySheet(0).Cells(ItemRow(0), WorksheetFunction _ .Match(c.Value, MySheet(0).Rows(ItemRow(0)), 0)).Offset(1).Resize(myRows).Value End If Next c With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

musti
質問者

お礼

ありがとうございます。すごいです。 ”C1”の値を”シート1”からB列に読み込むだけでよかったのですが、 シート2の”C”列と順に転記されていく方法なんですね。 他の時に応用させてください。

  • kagakusuki
  • ベストアンサー率51% (2610/5101)
回答No.2

 以下の様なVBAマクロでは如何でしょうか? Sub QNo9219574_合計一覧より参照_表記excel2007VBA() Dim i As Long, c As Range, SheetName(1, 1) As String, MySheet(1) As Worksheet, _ ItemRow(1) As Long, ItemColumn(1) As String, myColumns As Long, _ myRows As Long, LastRow As Long, LastColumn As Long SheetName(0, 0) = "Sheet1" '元データの表が存在するシートのシート名 SheetName(0, 1) = "元データが入力されている" '元データの表が存在するシートの説明文 SheetName(1, 0) = "Sheet2" '新たに表を作成するシートのシート名 SheetName(1, 1) = "データの転写先" '新たに表を作成するシートの説明文 ItemRow(0) = 1 '元データの表において項目名が入力されている行 ItemRow(1) = 1 '新たに作成する表において項目名が入力されている行 ItemColumn(0) = "A" '元データの表において顧客名が入力されている列 ItemColumn(1) = "A" '新たに作成する表において顧客名が入力されている列 For i = 0 To 1 If IsError(Evaluate("ROW('" & SheetName(i, 0) & "'!A1)")) Then MsgBox SheetName(i, 1) & "元データが入力されているシートとして設定されている" _ & vbCrLf & vbCrLf & SheetName(i, 0) & vbCrLf & vbCrLf & _ "というシート名のシートが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "存在しないシート" GoTo labelE End If Set MySheet(i) = Sheets(SheetName(i, 0)) Next i For i = 0 To 1 With MySheet(i) LastRow = .Range(ItemColumn(i) & Rows.Count).End(xlUp).row LastColumn = .Cells(ItemRow(i), Columns.Count).End(xlToLeft).column If LastRow <= ItemRow(i) Or LastColumn <= .Columns(ItemColumn(i)).column Then MsgBox "処理すべき元データが見つかりません。" & vbCrLf _ & "マクロを終了します。", vbExclamation, "データ無し" Exit Sub End If End With Next i myRows = LastRow - ItemRow(1) myColumns = LastColumn - MySheet(1).Columns(ItemColumn(1)).column With Application .ScreenUpdating = False .Calculation = xlManual End With MySheet(1).Range(ItemColumn(1) & ItemRow(1)).Offset(1, 1) _ .Resize(myRows, myColumns).ClearContents For Each c In MySheet(1).Range(ItemColumn(1) & ItemRow(1)).Offset(0, 1).Resize(1, myColumns) If c.Value <> "" And WorksheetFunction.CountIf(MySheet(0).Range( _ ItemColumn(0) & ItemRow(0)).Offset(0.1).Resize(1, 12), c.Value) > 0 Then c.Offset(1).Resize(myRows).Value = MySheet(0).Cells(ItemRow(0), WorksheetFunction _ .Match(c.Value, MySheet(0).Rows(ItemRow(0)), 0)).Offset(1).Resize(myRows).Value End If Next c With Application .Calculation = xlAutomatic .ScreenUpdating = True End With End Sub

musti
質問者

お礼

ありがとうございます。いつも勉強させていただいています。 中程の GoTo labelE でエラーになってしまいます。

  • kkkkkm
  • ベストアンサー率65% (1620/2460)
回答No.1

以下でどうでしょう。 Sub Example() Dim MyColunm As Long Dim ws1 As Worksheet, ws2 As Worksheet On Error Resume Next Set ws1 = Sheets("Sheet1") Set ws2 = Sheets("Sheet2") MyColunm = WorksheetFunction.Match(ws2.Range("C1").Value, ws1.Range("1:1"), 0) ws1.Cells(1, MyColunm).Resize(11, 1).Copy ws2.Range("B1") Set ws1 = Nothing Set ws2 = Nothing End Sub

musti
質問者

お礼

ありがとうございます。 例えば、1月売上→2016/1/20 と直した場合、VBA表記されなくなってしまいました…。

関連するQ&A

  • グループ合計 転記 excel2007 VBA

    Sheet1に月毎のの売上一覧があります。 Sheet2にSheet1の顧客別に合計したものを指定の位置へ転記したいのですが、 月によって売上セル領域が変動するため、いい方法がわかりません。 よろしくおねがいします。 Sheet1    A    B    C    D 1    日付   顧客   商品    売上 2   2月1日    あ  コーヒー  100 3   2月5日    え   卵    200 4   2月6日    い  パン    300 5   2月10日    い  リンゴ    100 6   2月18日    あ   バナナ  200 7   2月20日    え   みかん  100 8 9 Sheet2 A   B 1 顧客  売上合計 2 あ 3 い 4 う 5 え 6 お 7 か 8 き 9

  • EXCEL2000:ピボットテーブルから参照

    EXCEL2000で質問があります。 ピボットテーブルで作成した集計表に表示される値を参照して、別の集計表を作成したいのですが、ピボットテーブルを更新した際にデータに変更があるとその参照先セルの位置が変更してしまいます。 常にその項目(データの合計部分など)を参照するように設定することは可能でしょうか? ご回答よろしくお願い致します。 詳細は以下の通りです。 ●基本テーブル(sheet1:データ) 業績集計表です。 A列:契約者 B列:担当者 C列:売上げ(金額) D列:契約成立月 ●ピボットテーブル集計表(sheet2:集計表1) 行:担当者 列:契約成立月 データ:売上げの合計 ●計算式がある集計表(sheet2:集計表2) 各月の実績欄=集計表1の「契約成立月」ごとの「売上げの合計」 以上です。

  • エクセルで、複数の表から一覧表を作るには?

    エクセル初心者です。 会社で、毎月の経費を、科目/支払先別の表にしているのですが、最新の1年分を一つの一覧表にまとめなければなりません。 毎月の経費の表は、以下のようなイメージです。  A列    B列    C列 消耗品   A社   \○○○         B社   \○○○         C社   \○○○         D社   \○○○ 交通費   E社   \○○○         F社   \○○○… 支払先の会社は、毎月異なり、1月と3月はA社とC社があるが、 2月はB社とD社だけ…という感じです。 毎月作られているこの表を、以下のような一覧表にまとめなおしたいのです。  A列    B列    C列     D列    E列               (1月)   (2月)   (3月) 消耗品   A社   \○○○        \○○○         B社          \○○○              C社   \○○○        \○○○         D社          \○○○ \○○○ 交通費   E社   \○○○              F社   \○○○        \○○○ イメージとしては、A列の勘定科目ごとに、各月の表のB列から重複しないように支払先の会社名を抽出し、それを一覧表の項目として、金額は各月からVLOOKUP?で引っ張ってくる?ということができればいいな、と思っているのですが、どなたかいい方法をご存知の方はいませんか? ちなみに、各月の表はタブで分かれており、今後も毎月アップデートする予定ですので、その都度タブを追加する形になると思います。 使用しているExcelは2003です。 よろしくお願いします。

  • 【Excel】 別のSheetの値を参照したい。

    Sheet1の A1に年 A2~A13に月 A14に翌年 A15~月・・・と続きます。 また、 B列に各月の値 があります。 Sheet2の A1に、Sheet1 B列の2008年の1月の値 A21に、Sheet1 B列の2008年の2月の値 A41に、Sheet1 B列の2008年の3月の値 ・・・を表示させていたのですが、 Sheet1の月と行間が違うため、 1~20行のコピーでは、2月以降の値が参照できません。 このような場合A列の式はどのようになるでしょうか。 単にセル位置を指定し参照するのではなく、 「2008年の1月の値」を表示したいと言うことです。 SUMIFなのかなぁ‥とも思うのですが、具体的な方法が分かりません。 Sheet1のA列の月は、 「1」「2」「3」と入力されているだけです。 シリアル値にしないといけないでしょうか。 また、その方法はどうしたら良いのでしょうか。 Excel2003です。 よろしくお願いいたします。

  • EXCEL関数教えてください。(ブック内を参照後合計)

    巷には家計ソフトもありますが、EXCELで家計簿に挑戦しています。 シートが1月分から12月分と年合計の13枚あります。 各月シートのG列の任意の行にある「食費小計」と言う文字検索して、 その行のI列にある値の合計を年合計シートに入れるというものです。 '食費小計'でも検索条件の引数にしても出来なかった気がします。 1月分シートG41に「食費小計」と言う文字列を入れています。 =SUMIF('1月分:12月分'!G:G,'1月分'!G41,'1月分:12月分'!I:I) これは考えた関数ですがエラーでした。 SUMIF(範囲,検索条件,合計範囲)の使い方が間違っているのでしょうか。 このブック内のすべての「食費小計」と言う文字列を検索して、 その行のI列の値をすべて合計した値を年合計シートのあるセルに入れるという考え方でも方法があるのでしょうか。

  • エクセル。参照?

    こんばんは。 早速ですが質問をしたいと思います。 売上の日報の事で質問なのですが、今現在その日の売上合計(食品や生活品など項目別)と月一覧(1日・2日・・・・・31日)の入力をすることがあります。 当日の夕方レジを締めるときに売上の計算をし締めるのですが、その日の売上の合計を入力したあとに、月一覧の方にも同じ当日の売上合計を入力します。 項目別のほうのある特定の項目の合計を月一覧の方にも入力します。 例えば、セルC16に○○と○○の合計があり、その合計を別シート、または別ブックの6月16日の所へ同じ値が入力されるにはどのような式が適当でしょうか? また、6月17日・6月18日と日が経つごとに月一覧のほうもきちんとその日付のセルに入力になるようにしたいのです。 項目別の合計を入力するシートは、その日に紙に印刷をするのでシートは実質1シートのみの使用です。 月一覧の方は B列の2行目から→に1月・2月・・・・12月と入力。 A列の3行目から↓に1日・2日・・・・30日と入力されています。 このような形式だと適正な式はどうなりますでしょうか?

  • Excel関数を使って行・列が変わる合計の求め方

    Excelの関数設定が上手く出来ず困っています。 Excelの行を抽出、列が変数となる表の合計の求め方を教えてください。 Sheet1は販売製品・顧客・月別の売上金額表で、毎月数字を入力します。  A      B     C    D    E    F・・・ 1       顧客名  4月  5月  6月  7月・・・ 2 パソコン  Z社   20  40  30  10・・・ 3 プリンタ  Y社   10  20   5  25・・・ 4 サーバ   X社   15  15  20  10・・・ 5 パソコン  W社   35  30  20  20・・・ 6 プリンタ  V社   10  20  25  30・・・ 7 パソコン  U社    5   5  10   5・・・ Sheet2は、月次の分析表で、毎月の製品別の売上を分析します。   A      B      C   D   E   F・・・ 1 4月    2       売上金額   分析内容 3 パソコン  55     W社向け売上増etc 4 プリンタ  20     ・・・・・・・・ 5 サーバ   15     ・・・・・・・・ Sheet2のA1の月を変更すると、Sheet1の数字を参照して合計できる方法はありませんでしょうか? (たとえばA1を5月にすると、パソコン:75の合計が出る) Sumproductやindex、Offset等でいろいろ試してみましたが、上手く行きません。 Sheet3にSheet1の集計用の表を作り、Sheet2で再度集計する方法は上手くいきましたが、製品の種類が増えた時に全てのシートに追加する必要があるため、2つのSheetで完結する方法を探しています。 どなたかExcelに詳しい方、アドバイスをお願いします。

  • Excelで特定の日付範囲のデータの合計を出すには

    初めて質問させていただきます。 さまざまなホームページ、掲示板などを巡ってみたのですが解決できなかったため お力を貸していただけたらと思います。 1シート目がこのようなデータ表になっているとします。  A    B     C   111 2011/4/30 2,000 125 2011/4/15 3,000 143 2011/4/30 2,000 166 2011/5/31 5,000 178 2011/5/29 3,000 このデータを使用して、2シート目には、各月の合計金額を表示したいのです。 2011年4月 7,000 2011年5月 8,000 こんな感じです。ちなみに、1シート目のB列の日付は一定でないため1日だけを指定することが できません。 そこで、以下のような関数を考えてみました。 =SUMIF(1シート目!$B$1:$B$1000,IF(TEXT(1シート目!B1,"yyyym")="20114",),1シート目!$C$4:$C$1000) 日付を月までに省略し、それで判断させるというものです(言い回しが下手ですみません)。 ちなみになぜ1000行目まで指定しているかというと、今後もデータは増えていくためです。 現在ここまで式を作り上げたものの、「0」が返ってきます・・・ どこが間違っているのか、もしくはもっといい式があるようでしたら 教えていただけたら幸いです。 よろしくおねがいいたします。

  • excel2007VBA 日付参照 列表示

    シート1の締日が ”AA3” ~ 表記されていく表があります。     ”AA4”以下は、各顧客の合計金額が記録されています。(月毎に 列、行、共に増えます。) 同じシート内で、”K1”に表記した日付の列を、金額のみ”k4”以下に表記したいのですが、 いろいろ方法を考えてもどうしてもできません。 よろしくお願いします。

  • Excel関数 別シート参照現シートに合計値を表示

    お世話になっております。 Excel関数について質問させてください。 まず私の環境にExcelが入っておらず、OpenOfficeの3.3を代用しております。 カテ違いでしたらごめんなさい・・・。 【質問】 Sheet1のリスト(A列とする)に存在する文字列を Sheet2の複数列(D列、F列、H列)に一致する文字列毎の数値(E列、G列、I列)の合計を Sheet1の列(B列とする)に表示したい 【データ例】 ○Sheet1  A列 B列  A   3  B   10  C   6  D   0 ○Sheet2  D列 E列 F列 G列 H列 I列  A   1   G  0   A  1  C   2   H  2   B  2  B   3   A  1   C  4  E   4   B  5   E   5 【試した事】 まず一辺には無理だと思い、 Sheet1のB列に以下の関数を入れてみました =IF('Sheet2'.D1=A1;"a";"b") これで一見判定が出来てる風だったのですが、 Sheet1のB1列に"a"と出て、他全て"b"と出ました。 恐らく、順不同で比較項目が並んでいる所為だと思いますが、 この並び順を変更するわけにはいかず・・・。 そもそも、文字型と数値型が一つの関数に指定出来るのかも不明で・・・。 どなたかわかる方、ご教授お願いいたします。 わかりにくい例ですみません。 【補足】 私の個人的見解として、関数で出来る気がしないのですが、どうなんでしょう・・・? もし、関数で無理ならVBかJavaでゴリゴリ組みます。

専門家に質問してみよう