プロが教える店舗&オフィスのセキュリティ対策術

エクセルのシート1に三行置きに入力されているものを、シート2に四行おきに表示させたいのですが、どの様な関数を使えばいいのてしょうか?
それぞれの行が増えてきたときに、シート2の方をオートフィルで引っ張るだけでシート1の内容を表示させたく。。
お知恵をいただけましたら幸いです。

A 回答 (2件)

ええと……。

説明長くなるよ。

これは算数的な数字を弄り回すことになります。
何をするかというと、規則性を数式で示すのです。
これ、結構めんどくさいので考えるのが嫌になりますが、コラえてください。
一回でも理解できれば、次からは簡単に考えることができるようになります。

 原本 → 複製
1 A     A
2
3
4
5 B
6      B
7
8
9 C
10
11      C

こんな感じに複製したいということですよね?

 原本 → 複製
1 0     0
2
3
4
5 1
6      1
7
8
9 2
10
11      2

こんな感じに「番号」が振られていると思ってください。
規則性を持たせるため、行番号も

 原本 → 複製
0 0     0
1
2
3
4 1
5      1
6
7
8 2
9
10      2

こんな風になっていると思ってください。
すると、
原本側は、
 0および4の倍数の行に値があり、
複製側は、
 0および5の倍数の行に値がある
ことになります。

複製側は行番号を5で割って余りがゼロの行に複製したい。
複製する「番号」は行番号を5で割って小数点以下の値を切り捨てた「番号」になります。
その行番号は「番号」を4倍した行になります。

・・・

ROW関数はパラメーターを与えないと、そのROW関数が使われている行番号を返します。
B12セルに「=ROW()」と入力すれば「12」が返ってきます。

ということで、複製側のセルに
 =(ROW()-1)
で、行番号を1引いた値を読み取れます。
これを5で割って余りが0なら原本のセルを読みに行くという数式を作ればよい。
 (MOD((ROW()-1),5)=0
条件はこれで良いでしょう。
次に、何番目のデータを拾うかを検討します。
 INT((ROW()-1)/5)
拾う「番号」はこれで良いでしょう。
そして拾いに行く行番号は4倍すればよいので、
 INT((ROW()-1)/5)*4
になりますね。
つづいて、データを取得するセルを指定するのですが、このやり方は多数あります。
自分は INDIRECT関数 を使ってみます。
この関数は文字列をセル番地に置き換えてくれる関数です。
 =INDIRECT("A" & "12")
これは
 =A12
となります。
シート名を含める場合は
 =INDIRECT("Sheet2!A" & "12")
のようにシート名まで含めて指定すればよい。
……ということで、
 INDIRECT("Sheet1!" & "A" & INT((ROW()-1)/5)*4)
これで指定できます。
 「"Sheet1!" & "A" &INT((ROW()-1)/5)*4)」
         ↑
この"A"は実際に参照したい列の記号に置き換えてください。

・・・

条件と条件成立時の数式ができたので、IF関数に入れると
 =IF((MOD((ROW()-1),5)=0 , INDIRECT("Sheet1!" & "A" & INT((ROW()-1)/5)*4) , "")
という感じに出来上がります。
修正するならば、
 =IF((MOD((ROW()-1 ),5)=0 , INDIRECT("Sheet1!" & "A" & INT((ROW()-1 )/5)*4) , "")
 ↓
 =IF((MOD((ROW()-1+α),5)=0 , INDIRECT("Sheet1!" & "A" & INT((ROW()-1+β)/5)*4) , "")
のように α と β に適切な数字を入れて、実際のセルの行位置に合わせるくらいでしょうか。
この決め方は回答の冒頭で説明した内容を理解してれば一瞬で決められますが、
適当な数字を入れてちょうどいい感じに拾えるよう、何度も試行錯誤して決めてもOK。

なお、INDIRECT関数で使っている ”Sheet1!” と ”A” は文字列ですので、フィルコピーしても変化することはありません。
しかし変化しないということですので、原本側の列を増やしたり減らしたりした場合に参照セルの変化に対応しないので注意してください。
(A列を挿入すると "A" だったものはそのままなので参照する列がずれます…"B"に修正する必要あり。シート名を変えても文字列には反映されなのでこれも手動で修正する必要あり)

なお、エラー処理は考えていません。
都合の良い位置に数式を埋め込んでください。


・・・

とまあ、こんな面倒なことを頭の中で考えながら【規則性】とやらを読み取って数式として組み立てるんです。
    • good
    • 1
この回答へのお礼

ありがとう

お礼が遅くなってしまい大変申し訳ありません。
とてもとても親切に解説いただき誠にありがとうございます!!
私の説明が誤っていて、原本は0,3,6,9に値が入っていて、複製は、0,4,8,12と入る様にしたかったのですが、ご説明を読んでいてもはや頭から湯気が出そうなレベルです。。凄すぎです。。。

まずは、いただいた内容を元に、自分がやりたかった行数で試せるかトライしてみます…自信ないですけど(T_T)
貴重なお時間を割いていただき本当にありがとうございました!!!

お礼日時:2022/12/08 01:26

こんにちは



>どの様な関数を使えばいいのてしょうか?
内容としてはセルの参照を行えばよいだけですが、参照先のセル位置を計算する必要があります。
規則性があるので、その規則に基づいて計算をすれば良いでしょう。

具体的なレイアウトが不明なので、例示になりますが・・・
・Sheet1の「三行おきに入力」されているセルを、A1、A5、A9・・とします。
・Sheet2の表示させたいセルを、A1、A6、A11・・とします。

結果的に、
 Sheet2のA1にSheet1のA1の内容
 Sheet2のA6にSheet1のA5の内容
 Sheet2のA11にSheet1のA9の内容
   ・・・・・
が表示されればよいものと仮定します。
(位置が異なる場合は、同じような要領で調整すれば可能です)


Sheet2に式を設定するとして、表示しないセルは空白表示で良いのなら、表示するセルは
 MOD(ROW(),5)
が1の時にだけ表示すれば良いことがわかりますので、
=IF(MOD(ROW(A1),5)=1,セルを参照する式,"")
としておけばよいことになります。

「セルを参照する式」は行番号が1,6,11・・の時だけ実行されますが、Sheet1の
 INT(ROW(A1)/5)*4+1 行目を参照すれば良いことになります。
 (上記は、1,6,11・・行目では、1,5,9・・の値になります)
参照したいのが、Sheet1のA列なら、これを用いて
 INDEX(Sheet1!A:A,INT(ROW(A1)/5)*4+1)
として参照すれば、目的のセルを参照することができます。


以上の内容をまとめると、Sheet2のA1セルに
 =IF(MOD(ROW(A1),5)=1,INDEX(Sheet1!A:A,INT(ROW(A1)/5)*4+1),"")
の式を入れて、フィルコピーすることでできると思います。

※ 実際のセル位置は、ここで仮定した位置とは違うのではと推測しますので、適宜調整してください。
 そのために、敢えて長々とした説明をしてありますので。
    • good
    • 2
この回答へのお礼

ありがとう

お礼が遅くなってしまい大変申し訳ありません。
銀鱗様へのお礼にも記載させていただいたのですが、私の説明が上手くなくて、折角お二人から貴重な知識をいただいたにも関わらずご厚意を無駄にしてしまいました…(T_T)
まずは、お二人からご説明いただいた内容を理解してみるところから始めてみようと思います。
貴重なお時間を割いていただき、本当にありがとうございました!!!

お礼日時:2022/12/08 01:29

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