• ベストアンサー

EXCELでINDIRECTを使いたいのですが?

一度質問させていただき、INDIRECTを使うことをおしえていただきました。 でも、SHEET1の10行3列の規定のフォーム(表)に、SHEET2の500名分のデータを差し込みたいのですが、どのようにしたらよいでしょうか? SHEET1 は、5名までの個人データの規定フォーム(表)2行3列が1人分データ   A     B     C 1ページ    1名前  会社住所  TEL   2     本人住所  TEL    3名前  空白 4     本人住所  TEL 5名前  会社住所  TEL 6      本人住所  TEL 7名前  空白      8      本人住所  TEL 9名前  会社住所  TEL 10     本人住所  TEL SHEET2は、500名分のデータ(リスト)   A  B      C    1名前  会社住所  TEL   2     本人住所  TEL    3名前  空白 4     本人住所  TEL 5名前  会社住所  TEL 6      本人住所   TEL 7名前  空白      8      本人住所  TEL 9名前  会社住所  TEL 10     本人住所  TEL      :      :      455名 どうかよろしくお願いします。

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

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

補足頂いたが、良く判らない点があります。 しかしSheet2-->Sheet1にデータを写すのだと解釈して やって見ました。 (データ) Sheet2の(本当は」6列のようだが、3列に簡略化した。 A2:C12に(文字列を入れた。面倒なので氏名、住所の代わりと位置関係が判りやすいように) a1 a2 a3 a4 a5 a6 b1 b2 b3 b4 b5 b6 c1 c2 c3 c4 c5 c6 d1 d2 d3 d4 d5 d6 e1 e2 e3 e4 e5 e6 f1 f2 f3 (関数を作成)準備作業。Sheet1で使う関数を複雑にしないために作ったユーザー関数。 VBEの標準モジュールに Function g(r) Select Case (r - 1) Mod 4 Case 1 g = 0 Case 2 g = 1 Case 3 g = 2 Case 4 g = 0 End Select End Function '------- Function h(r) h = Int((r - 2) / 4) End Function を作る。何をやっているか判っていただくために E2セルに=g(row())といれ、F2に=h(row()) といれ下に複写すると 0 0 1 0 2 0 0 0 0 1 1 1 2 1 0 1 0 2 1 2 2 2 0 2 0 3 となります。4行でF列数字が変わる、E列は第1,4行が0で、2行目が1、3行目が2です。以上は説明のために E,F列に出したもので、本題とは直接関係ありません。 (関数式) Sheet1のA2に =IF(g(ROW())=0,"",OFFSET(Sheet2!$A$1,h(ROW())*2+g(ROW()),0)) といれ、下へ複写します。 するとA2:A16に((S)は空白行を示す仮の記号) (S) a1 a4 (S) (S) b1 b4 (S) (S) c1 c4 (S) (S) d1 d4 となります。 B2には最後の引数0を1に、C2には最後の引数0を2に して下へ複写します。 B2の式は=IF(g(ROW())=0,"",OFFSET(Sheet2!$A$1,h(ROW())*2+g(ROW()),1)) (結果) A2:c16は a1 a2 a3 a4 a5 a6 b1 b2 b3 b4 b5 b6 c1 c2 c3 c4 c5 c6 d1 d2 d3 d4 d5 d6 となりました。

purepop
質問者

お礼

大変ご足労おかけしてしまい、申し訳ありませんでした。 勉強させていただき、本当にありがとうございました。

その他の回答 (6)

  • comv
  • ベストアンサー率52% (322/612)
回答No.6

#3 #4 の comv です #4の式は 10名と最初の質問の10行を取り違えていました!5名分なんですね 式中の  *30 (10人×3行) → *15 (5人×3行) コピー範囲を  50行目 → 25行目 に変更して下さい ----訂正------- Sheet1 ・A1に  =TEXT(INDEX(Sheet2!$A:$E,($G$1-1)*15+ROUNDUP(ROW(A1)*3/5,0),COLUMN(A1)),"#;@")  B1:E1へ複写  A3:E4へ複写 ・A1:E5を選択  25行目まで下へフィルドラッグ

purepop
質問者

お礼

教えていただきありがとうございました。

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

#2です。#2の補足について、さらに質問します。 ●Sheet2の様子はわかります。 1.3行目 空白,空白,空白 ,入力 ,空白,空白 の入力欄には何が入っているのでしょうか。 2つ目の連絡先ですか。 2.1人2行で500人分あると言うことは、1(見出し行)+2*500行=1001行現在データがあると言うことですね。 これは完成したものですか。1002行以下、今後日々月月増えないのですか。 社員番号は入ってないのですか(不思議)。 ●Sheet1について 1.「6人目から、自動的に2ページと変わっていくようにしたいのです」とは エクセルは単一の表です。本来ページの考えはありません。印刷する時にはページ区切りを入れて印刷して2ページ・3ページ・・・・とする(なる)ことが出来ますが、表の上ではページを作るとはどうするのでしょう。罫線を使ったりして、それらしく見せることは出来ますが、次のページの先頭は直下行からでなく、下余白行を置き、次ページの上余白行も置くのではと思いますが、 そうではないのですか。 2.質問はただSheet2のデータの項目を並べかえる(組みかえる)だけですか。特徴から察すると 第1行目だけは、見出しで特別扱いである。 Sheet1の2行目以下は (A)1余白行を入れる (B)Sheet2の1人分の上の行をそのままもってくる (C)Sheet2の1人分の下の行をそのままもってくる (D)1余白行を入れる のパターンの、4行の繰り返しをすれば良いのですか。 3。Sheet1は、ある社員の情報を見たい時は、探す仕掛けが何もなく、探しにくいですがそれで良いのですか。 アクセスなどなら、Sheet2は「テーブル」ファイルに相当し、フォームは1名分だけ(または5名)見せたり・入力させる「フォーム」と検索システムが引っ付いた仕組みになると思いますが、それと随分違うようなので、想像がしにくいです。余談ながらエクセルで人事関連のシステムを作ると、ただ表にしただけになり、活用が難しいように思います。 4.最終次の段階で印刷するのですか(前回答で質問したが答えなし)

purepop
質問者

お礼

回答ありがとうございます。 連絡遅れまして申し訳ありません。 SHEET2 1.2つ目の連絡先 出身地(実家)などです。 2.はい、見出し行は、最初の行の1行目だけで、1(見出し行)+2*500行=1001行のデータです。 リストに、人を採用すれば必然的に増え、退職すれば、減ります。 入力された完全な社員データ(社員コード)は、別のブックにあり、SHEET1に必要なデータのみコピーしたものがSHEET2にあるのです。 SHEET1 SHEET1の5人分だけが、規定のフォームで、その中に入力していかなければいけないのが現状です。 ですから、2ページ目は、フォームの入力欄の中が、変わっていくのです。 1.以前教えていただいた方の関数を使うと、   =INDIRECT("Sheet2!R"&($G$1-1)*5+ROW()&"C"&COLUMN(),0) でした。 確かに、SHEET1とSHEET2の行が同じ連続したものであったなら、うまく行きましたが、実際の職場のフォームは、SHEET1が、4行分で1人のデータを入力しなければいけない様式となっていますので、上の関数のROW( )の行に、SHEET2の一人一人のデータの行をそれぞれあてはめてみたのですが、 SHEET2のデータは、SHEET1へ入るが、SHEET1の2ページ目からSHEET2のデータの順序がすべて変わってしまいました。 2.(C)です。 3.SHEET2で、確認する予定です。 4.印刷は、1ページづつ印刷するしかない現状です。 最後に、私の会社で誰が作成したのか、このEXCELのSHEET1のフォームが、規定の様式となってしまっているのです。 せっかく、別のブックで社員全体のデータリストがあるのだから、これを何とか生かしたいと思い、思いついたのです。 ご無理を言って、ご迷惑をおかけしましたが、ご親切に本当にありがとうございました。  

  • comv
  • ベストアンサー率52% (322/612)
回答No.4

再びこんにちは 要は3行単位の元表から5行飛びで取り出せれば よいのでしょうか? そして配置は5行単で  1行目 → Sheet21行目  3行目 → Sheet22行目  4行目 → Sheet23行目 を前提で前回の式と可変値だけが違うだけですが G1にページ値 として Sheet1 ・A1に  =TEXT(INDEX(Sheet2!$A:$E,($G$1-1)*30+ROUNDUP(ROW(A1)*3/5,0),COLUMN(A1)),"#;@")  B1:E1へ複写  A3:E4へ複写 ・A1:E5を選択  50行目まで下へフィルドラッグ で如何でしょうか

  • comv
  • ベストアンサー率52% (322/612)
回答No.3

こんにちは なんか以前似たようなご質問にレスした記憶が あるような(^^ INDIRECT() も OFFSET() も 面白いくらい同じ処理ができる関数で 他ブック参照時は対象が開いていないと不可 自動で再計算処理をするためブックを開いて何もせず に閉じる時でも「保存しますか?」のMsgが出るのも 共通している双子のような て前置きが長くなりましたが 既に両関数での式は提示されているのでINDEX()での例を D1に「何人目から」の値があるとして セルA1に =TEXT(INDEX(Sheet2!$A:$C,($D$1-1)*2+ROW(A1),COLUMN(A1)),"#;@") 必要な範囲まで複写 式中の *2 が2行単位の意味です

purepop
質問者

補足

確かに以前教えていただきました。その節は、大変お世話になり、ありがとうございました。 教えていただいたINDIRECT関数ですが、いざ、職場のフォームであわせるとデータの順番がずれるようになってしまい、うまくいかないのです。 私の説明がわかりずらくてすみません。 実は、私の会社の社員データを入力するための入力(様式)フォームに、すでに別のシートに500名分の社員データが作成されたリストを、社員データ入力フォームに自動的に500名分を差し込みたいと思っています。 フォームは、会社の規定の様式ですから、絶対にくずすことができません。 例を挙げて教えていただこうと思ったのですが、会社のフォームを忠実にお知らせします。(EXCELを使っています。) 私の会社のフォームの様式は、SHEET1にあります。 SHEET1  5人分社員データを入力するための入力表フォーム(様式)があり、2行から5行までが1人目の入力欄で、6~9行目が2人目、10~13行目が3人目、14~17行目が4人目、18行~21行が5人目です。ここでは、表ができないので、カンマ区切りで1列と示します。 1行目 名前,役職,所属課,連絡先,年齢,性別 1ページ 2行目 空白,空白,空白 ,空白 ,空白,空白   3行目 入力,入力,入力 ,入力 ,入力,入力 4行目 空白,空白,空白 ,入力 ,空白,空白 5行目 空白,空白,空白 ,空白 ,空白,空白 入力となっている箇所は、入力欄で、これが1人目の入力箇所です。SHEET1は、5人分です。6人目から、自動的に2ページと変わっていくようにしたいのです。 SHEET2は、500名のデータリストがあります。 1行目 名前,役職,所属課,連絡先,年齢,性別 2行目 入力,入力,入力 ,入力 ,入力,入力 3行目 空白,空白,空白 ,入力 ,空白,空白 2~3行(2行)で1名のデータです。また、4行目から、2行ずつ1名づつの500名分のリストです。 どうか、この説明でご理解いただけたでしょうか? INDIRECTを利用することを、以前、教えていただいたのですが、SHEET1の2ページ目からSHEET2のデータがずれていきます。どうかお助けください。 よろしくお願いします。

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

差しこみと言うより、抜き出したいと言うことでしょうか。Sheet2のスタートのN人目を与えて、Sheet2上で、連続した続きの5人分をSheet2に持ってきたいと言うことですか。 N人目を与えるのであればスタート行は(N-1)*2+1に変えれば良い。 INDIRECTは必要ないと思います。 スタートをN人目から5人分として、E1セルにNが入っているとして Sheet1のA1に =OFFSET(Sheet2!$A$1,($E$1-1)*2+ROW()-1,COLUMN(A$1)-1) を入れ、A1をC1まで複写。 A1:C1を範囲指定し、+ハンドルをだし、A2:C10まで複写 する。 式の中で-1しているのは、OFFSETが「ずれ」数を指定するものなのでそうなります。3行目は1行目から、「ずれ」は2になります。 OKWEBであるなら、元の質問の番号等も掲げていただくと 判りやすい。 (質問文例)「Sheet2に2行(3列)が一組みで1人分のデータが500人分あります。Sheet1に何人目から持ってくるかを指定し、そこから以下5人分をSheet1に持ってくる方法は」 それと多分その後に印刷作業が待っていると思うが、 そうなるとVBAを使うべき問題だと思います。

purepop
質問者

補足

私の質問の説明がわかりずらくてすみません。 実は、私の会社の社員データを入力するための入力(様式)フォームに、すでに別のシートに500名分の社員データが作成されたリストを、社員データ入力フォームに自動的に500名分を差し込みたいと思っています。 フォームは、会社の規定の様式ですから、絶対にくずすことができません。 例を挙げて教えていただこうと思ったのですが、会社のフォームを忠実にお知らせします。(EXCELを使っています。) 私の会社のフォームの様式は、SHEET1にあります。 SHEET1  5人分社員データを入力するための入力表フォーム(様式)があり、2行から5行までが1人目の入力欄で、6~9行目が2人目、10~13行目が3人目、14~17行目が4人分、18行~21行が5人目です。ここでは、表ができないので、カンマ区切りで1列と示します。 フィールド名に、 1行目 名前,役職,所属課,連絡先,年齢,性別 1ページ 2行目 空白,空白,空白 ,空白 ,空白,空白   3行目 入力,入力,入力 ,入力 ,入力,入力 4行目 空白,空白,空白 ,入力 ,空白,空白 5行目 空白,空白,空白 ,空白 ,空白,空白 入力となっている箇所は、入力欄で、これが1人目の入力箇所です。6人目から、自動的に2ページと変わっていくようにしたいです。 SHEET2は、500名のデータリストがあります。 1行目 名前,役職,所属課,連絡先,年齢,性別 2行目 入力,入力,入力 ,入力 ,入力,入力 3行目 空白,空白,空白 ,入力 ,空白,空白 2~3行(2行)で1名のデータです。また、4行目から、2行ずつ1名づつの500名分のリストです。 どうか、ご理解いただけたでしょうか? INDIRECTを利用することを、以前、教えていただいたのですが、SHEET1の2ページ目からSHEET2のデータがずれていきます。どうかお助けください。 よろしくお願いします。

noname#5187
noname#5187
回答No.1

今ひとつ用途が分らないのですが・・・・ Sheet2のD1セルに何番目の人から5人分を表示するかを 指定するものと想定しての回答です Sheet1のA1セルに以下の数式を入力してA1~C10に数式をコピーします =INDIRECT(ADDRESS(($D$1-1)*2+ROW(A1),COLUMN(A$1),,,"Sheet2"))

purepop
質問者

お礼

教えていただきありがとうございました。

関連するQ&A