• 締切済み

一行の中から複数の値を抜き出す。

tom04の回答

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.5

No.1~3です。 補足を読みました。 結局 名簿Bookには各月1Sheetで12Sheetあり、当然のコトながら月跨ぎでの宿泊もある! というコトですね! いずれにしても1年分を1Sheetにまとめた方が処理が簡単だと思います。 関数で!というとかなり厄介になりますので、VBAでやってみました。 ただし、下準備として ↓の画像で左側が「名簿」Bookの各Sheetのレイアウトになります。 Sheet見出し上には4月~翌年の3月までの12Sheetが存在するとしています。 「4月」のSheet見出しをクリック → Shiftキーを押しながら最後の3月のSheet見出しをクリック! これで12Sheetが作業グループ化されましたので A1セルを選択 → 右クリック → セルの書式設定 → 表示形式 → ユーザー定義から 0年 と入力 → OK A2セルを選択 → 右クリック → セルの書式設定 → 表示形式 → ユーザー定義から 0月度 と入力 → OK B1セル → セルの表示形式はユーザー定義から d としておき、 =IF(MONTH(DATE($A1,$A2,COLUMN(A1)))=$A2,DATE($A1,$A2,COLUMN(A1)),"") という数式を入れます。 B2セルの数式は =IF(B1="","",TEXT(B1,"aaa")) として、B1・B2セルを範囲指定 → B2セルのフィルハンドルで31日分のAF列までコピー! → Sheet見出し上で右クリック → 作業グループ化を解除 各SheetのA1・A2セルに「年」と「月」の数値のみを入力していきます。 これで第一段階の準備は完了です。 この「名簿」Bookの13Sheet目を追加して Sheet名を「作業用」としておきます。 VBAでこの「作業用」Sheetに1年分のデータを表示させ、 そのデータを利用し、↓の画面右側の「宿泊一覧」BookのSheet1に表示させます。 「宿泊一覧」のSheet1のD2セルに =IF(A2="","",C2-B2+1) E2セルに =IF(A2="","",C2-B2) という数式を入れ両列ともオートフィルでしっかり下へコピーしておいてください。 これで下準備は完了です。 最後に「名簿」Bookを開き → Alt+F11キー → メニュー → 挿入 → 標準モジュールに ↓のコードをコピー&ペーストしマクロを実行してみてください。 (Alt+F8キー → マクロ → マクロ実行です) Sub 名簿更新() 'この行から Dim i As Long, j As Long, k As Long, endRow As Long, endCol As Long Dim c As Range, wS1 As Worksheet, wS2 As Worksheet Application.DisplayAlerts = False Workbooks.Open ("宿泊一覧") Application.DisplayAlerts = True Workbooks("名簿").Activate Set wS1 = Worksheets("作業用") Set wS2 = Workbooks("宿泊一覧").Worksheets("Sheet1") endRow = wS2.Cells(Rows.Count, "A").End(xlUp).Row If endRow > 1 Then Range(wS2.Cells(2, "A"), wS2.Cells(endRow, "C")).ClearContents End If endRow = wS1.UsedRange.Rows.Count If endRow > 1 Then wS1.Rows(2 & ":" & endRow).ClearContents End If For k = 1 To 12 With Worksheets(k) Set c = wS1.Rows(1).Find(what:=.Cells(1, "B"), LookIn:=xlValues, lookat:=xlWhole) j = c.Column endRow = .UsedRange.Rows.Count endCol = .Cells(1, Columns.Count).End(xlToLeft).Column Range(.Cells(2, "B"), .Cells(endRow, endCol)).Copy wS1.Cells(2, j) End With Next k For i = 3 To wS1.UsedRange.Rows.Count For j = 1 To wS1.Cells(1, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" And wS1.Cells(i, j) <> "→" And wS1.Cells(i, j) <> "退" Then With wS2.Cells(Rows.Count, "A").End(xlUp).Offset(1) .Value = wS1.Cells(i, j) .Offset(, 1) = wS1.Cells(1, j) k = j Do Until wS1.Cells(i, k) = "退" k = k + 1 Loop .Offset(, 2) = wS1.Cells(1, k) End With j = k End If Next j Next i wS2.Range("A1").CurrentRegion.Sort key1:=wS2.Range("B1"), order1:=xlAscending, Header:=xlYes wS2.Columns.AutoFit End Sub 'この行まで ※ 今回も顧客名に重複はない!という前提です。 ※ 画像で、「田中」さんは月跨ぎにしてみました。 ※ 名簿シートの入力方法は画像のように最初に「お客様名」途中は「→」最後は「退」とします。 関数でないのでデータ変更があるたびにマクロを実行する必要があります。 この程度が今の段階では精一杯です。m(_ _)m

関連するQ&A

  • 一列から複数の範囲の値を抜き出す方法。

    エクセルを使用し、画像の左側のような表を作っています。説明の為、短くしてありますが実際のファイルは横にずらーっと日付が並んでおり、一年で一つのファイルです。 部屋番号も下に10ほど並んでおります。 画像を一枚に収めるために、表を二つ入れてありますが、実際にはこの二つの表は別々のファイルにしたいです。(左側の表のファイル名を名簿.xlsxlとします) 名簿.xlsxを別のエクセルファイル(宿泊一覧.xlsx)から読み込んで、 名簿.xlsxから宿泊者名を自動で抜き出して、滞在日数や泊数を計算させて表を作成させることは可能でしょうか? 画像を一枚に収めるために、表を二つ入れてありますが、実際にはこの二つの表は別々のファイルにしたいです。 名簿.xslxをどんどん更新すると、宿泊一覧にも名前が更新されるようにしたいのですが、関数だけではできないものなんでしょうか? VBAはよくわからないので、できれば関数でやるやり方を教えて頂ければありがたいです。

  • Excel:数式のブック名部分を関数にしたい

    今エクセル作業ですごく悩んでいることがあります。 色々調べたのですが、エラーになってしまうので、関数等に詳しい方に質問があります。 作業中のエクセル画面を簡単に再現した画像を添付するので、それを参照していただきたいのですが、 Dドライブの「資料フォルダ」に  2009.11東京一覧表 2009.11神奈川一覧表  2009.10東京一覧表 2009.10神奈川一覧表  2009.9東京一覧表 2009.9神奈川一覧表 などというエクセルファイルが沢山あるとします。 (ファイル名にピリオドを入れない方がいいのは存じていますので今回は気にしないでください) そして、現在作成中のエクセルの、B3にフォルダ内のエクセルブック名の年月の部分、C3に店舗名部分を入れると、C6にそのブック名の一覧表の「名簿」シートのB8セルの値が表示されるようになる、関数をお伺いしたいのです。 例えば、B3に「2009.11」C3に「東京」と入れると、C6に「2009.11東京一覧表」ブックの「名簿」シートのB8セルの値が出る・・・という感じです。 分からないながらに、自分でブック名の中に関数(セル番地?)を入れて   ='D:\資料フォルダ\[B3&C3&"一覧表.xls"]名簿'!$B$8 などと入力してみたのですが、[ ]の部分に関数(セル番地?)を入れると、エラーになってしまいました。 色々調べてINDIRECT関数というものを使ってみたりしたのですが、全くうまくいきません。 どうすれば希望通りに値が出るようになるか、お分かりの方は知恵をお貸しください。 どうかよろしくお願いします。

  • エクセルでセル参照元のファイル名に*を使いたい

    お世話になります。 別ファイルのエクセルシートの特定のセルを参照させたいのですが、下記のようにファイル名の後にワイルドカードを使う方法はないのでしょうか? =[HH一覧表.xlsx]Sheet1!$B$5 ⇒ =[HH一覧表*.xlsx]Sheet1!$B$5 「HH一覧表 1月・・・」というようにファイル名がHH一覧表から始まる複数のファイルが有って、そのファイルを開いた時に別のエクセルに指定のセルを参照させたいのですが、何か方法は無いでしょうか? VBAのコードは教えてもらったのですが、ハードルが高く簡便法を探しています。

  • エクセルで複数の条件を満たした値を返す関数を教えてください。

    エクセルで複数の条件を満たした値を返す関数を教えてください。 (画像を添付しました) 左の表(A1からD9)のデータを右の表でIDと製品を選択すると 会社名、名前が抽出するような関数を教えてください。 INDEXやMATCHなど使ってみたんですが、組み方が悪いのかうまく抽出できませんでした。 よろしくお願いします。

  • ハイパーリンクを自動で貼る

    本.xlsxというエクセルファイルのB列に データが並んでいるのですが、 本一覧.xlsxというエクセルファイルで 本.xlsxのB1の値で検索をかけて、見つかった そのセルナンバーを覚えて、本.xlsxのA1に こんな感じで [本一覧.xlsx]本一覧!c1835 ハイパーリンクをつけていっているのですが、 数がかなりあり、手動ではとても時間がかかってしまいます。 これをやることができる関数があれば教えてください。 他にマクロなど別の方法があればそちらでもかまいませんので、 よろしくお願いします。

  • エクセルで強制終了後の修復データが値の更新が出る

    エクセルで強制終了になり修復データを開きました。 すると関数の参照がおかしく正しく反映がされません。 ●正しい参照  '[商品情報 一覧表.xlsx]ピックアップ'!G8 ●修復後の参照  'C:\Users\master\AppData\Roaming\Microsoft\Excel\[商品情報 一覧表.xlsx]ピックアップ'!G8 C:\Users\master\AppData\Roaming\Microsoft\Excel に商品情報 一覧表のデータを置き開くと 正しい参照になりますが閉じると元に戻ります。 C:\Users\master\AppData\Roaming\Microsoft\Excel の文字を消しても消えません。 元に戻す方法はないでしょうか?

  • [EXCEL]外部エクセルの値の参照

    複数のエクセルファイルがあり、それぞれパスやファイル名が異なります。それぞれのファイルのパスの一覧の情報値を元に、各ファイルの指定セルを取得する関数はないでしょうか? indirect関数を用いた場合、そのファイルを開いておかなければならい欠点があるため、良い方法があればアドバイスを頂ければと思います。

  • VLOOKUP関数で得られた値「#N/A」は「0」にならないでしょうか?

     エクセル2000でVLOOKUP関数のことで教えてください。  利用日6桁、室名を2桁、時間帯を1桁、計9桁の検索値を持った施設利用状況一覧表をつくります。そして、この表をもとに毎日の利用一覧表もつくれるファイルづくりを考えています。  さて、この施設利用状況一覧表には飛番号が多く、VLOOKUP関数で検索をかけた場合、飛番号分には「#N/A」が返ってくることがわかったのですが、これを「0」(数として認識して欲しい)にする方法がないでしょうか。宜しくご教示の程お願いします。

  • 【Access2013】 上書き保存と追加保存

    会社PCがWin10&Office2013へ交換されました。 Excelファイル(xlsx)で出力する際、保存場所とファイル名を自由に指定できるようにしたく添付画像のようなコードを作成しました。 しかし、同名ファイルがあっても「上書き保存しますか?」ダイアログが出ない上に、違うテーブルやクエリーをExcel出力すると1つのxlsxファイル内に別sheetで保存されます。 (例) Q_管理表というクエリーを管理表.xlsxという名前で出力    →続けてテーブル1というテーブルをExcel出力し管理表.xlsxに上書き保存すると管理表.xlsxの中に「Q_管理表」「テーブル1」という2つのsheetで保存される    →続けてQ_管理表を再度出力するとsheet「テーブル1」はそのままでsheet「Q_管理表」は上書きされる 1つのxlsxファイル内に別sheetで保存されるのはむしろ好都合なので、上書き保存と追加保存を選択できるようなコードはありませんか? できない場合は「上書き保存しますか?」ダイアログを出して上書き保存させたいです。

  • エクセルでの外部データの取り込み?参照??

    いつもお世話になっております。 エクセル2007での外部データでの取り込みについてお尋ねします。 (条件:例) Aファイル(東京都xlsx 埼玉県xlsx 神奈川県xlsx・・・・・と複数ファイル(A列に日付、B列以降に気温、降水量・・・)) Bファイル(データファイル(随時更新):地域ごとの気温の一覧表(A列に日付、B列以降に気温))     と二種類のエクセルファイルがあります。 現在はAファイルごとにVLOOKUP関数によって、VLOOKUP(日付、外部データ、MATCH("東京都"・・・)みたいな関数で読み込んでおり、気温のグラフなんかを作成しています。 ここで質問です。 今後Aファイルの数を増やしていく予定で、上記のような方法ではデータを移動させた時にリンクがおかしくなってしまうのではないか??って不安で・・・このような操作を行う場合の最良の方法を教えてください。 どうぞよろしくお願いいたします。