現在A1に「あ」,A2に「い」,A3に「う」と入っています.
この時にB1とB2に「あ」,B3とB4に「い」,B5とB6に「う」
といった感じに簡単に入力する方法を教えてください.
実際のデータは3行ではなく10行程度あり,
それを隣の列に上記のように入力したいわけです.
可能ならば一番上のセルに関数等を入力後に
オートフィルでドラッグするだけでよい方法が理想です.
よろしくお願いします.
やはりマクロの方が簡単なようなので、マクロでの回答例です。
コメントの仕様をベースにしました。
Sub makeTable() Dim baseRange As Range Set baseRange = ActiveCell Dim lastLine As Long lastLine = baseRange.End(xlDown).Row Dim startLine As Long startLine = baseRange.Row Dim tableSize As Long tableSize = lastLine - startLine + 1 baseRange.Offset(0, 2).Value = 0 Dim i As Long Dim dSum As Double For i = 0 To tableSize - 1 dSum = dSum + baseRange.Offset(i, 0).Value baseRange.Offset(2 * i + 1, 2).Value = dSum baseRange.Offset(2 * i + 2, 2).Value = dSum baseRange.Offset(2 * i, 3).Value = baseRange.Offset(i, 0).Value baseRange.Offset(2 * i + 1, 3).Value = baseRange.Offset(i, 0).Value Next baseRange.Offset(tableSize * 2, 2).Value = "" End Sub
シートのタブを右クリック⇒コードの表示をし、コードを貼り付けてください。
(ファイルのバックアップをとってから実行してください。)
元となる表の左上の数値を選択した状態で、Alt+F8 を押し、makeTable を実行してください。
元のテーブルの右側に御所望のテーブルが作成されるかと思います。
不明な点は、コメントでご質問ください。
B1に
=INDIRECT("A"&INT((ROW() +1)/2))
で、B1をコピー、必要な範囲を選択して貼り付けでどうでしょうか。
ありがとうございます.
例の挙げ方が悪かったのですが,
実際のデータはA4~A9まで,A18~22まで,A32~A36までと
複数のブロックがあるものなので
=INDIRECT("A"&INT((ROW()+4)/2))
として使ってみました.
ただこの場合は最初のブロックはうまくいきますが,
次のブロックは「+18」に直さないとうまく表現されませんでした.
これを一つの式であとはコピペするだけにできないものでしょうか?
例示の通りの場合、
B1=INDIRECT("A"&ROUND(ROW()/2,0))
以下フィルコピーでご希望の表示が出来ると思います。
http://www.officetanaka.net/excel/function/function/indirect.htm
ありがとうございます.
例の挙げ方が悪かったのですが,
実際のデータはA4~A9まで,A18~22までと
複数の表があるものなので
=INDIRECT("A"&ROUND(ROW()/2+3,0))
として使ってみました.
ただこの場合は最初のブロックはうまくいきますが,
次のブロックは「+17」に直さないとうまく表現されませんでした.
これを一つの式であとはコピペするだけにできないものでしょうか?
やはりマクロの方が簡単なようなので、マクロでの回答例です。
コメントの仕様をベースにしました。
Sub makeTable() Dim baseRange As Range Set baseRange = ActiveCell Dim lastLine As Long lastLine = baseRange.End(xlDown).Row Dim startLine As Long startLine = baseRange.Row Dim tableSize As Long tableSize = lastLine - startLine + 1 baseRange.Offset(0, 2).Value = 0 Dim i As Long Dim dSum As Double For i = 0 To tableSize - 1 dSum = dSum + baseRange.Offset(i, 0).Value baseRange.Offset(2 * i + 1, 2).Value = dSum baseRange.Offset(2 * i + 2, 2).Value = dSum baseRange.Offset(2 * i, 3).Value = baseRange.Offset(i, 0).Value baseRange.Offset(2 * i + 1, 3).Value = baseRange.Offset(i, 0).Value Next baseRange.Offset(tableSize * 2, 2).Value = "" End Sub
シートのタブを右クリック⇒コードの表示をし、コードを貼り付けてください。
(ファイルのバックアップをとってから実行してください。)
元となる表の左上の数値を選択した状態で、Alt+F8 を押し、makeTable を実行してください。
元のテーブルの右側に御所望のテーブルが作成されるかと思います。
不明な点は、コメントでご質問ください。
ありがとうございます.
コメント欄の修正を反映したら完璧でした.
報告書にまとめるデータの整理に大いに役立ちます.
作業列を2列使いますが関数でできたので貼り付けておきます。
元の表は、コメントの例のように文字の見出しがありその下のデータがあるものとしています。
C5 =IF(B4<>"",IF(ISNUMBER(B4),"",ROW()),"") D5 =IF(C5>0,C5,IF(D4<>D3,D4,D4+1)) E5 =IF(INDIRECT("A"&D5)<>"",IF(C5>0,0,IF(D5<>D6,E4+INDIRECT("A"&D4),E4)),"") F5 =IF(INDIRECT("B"&D5)<>"",INDIRECT("B"&D5),"")
これを下にコピー、E,F列が希望のデータだと思います。
C列はデータの最初の行に行数を直接入れていただいても良いです。
E,F列の<>""のIF関数はISNUMBERで数字かどうかでも良いような気もします。
小数点以下の表示形式は、
http://allabout.co.jp/computer/msexcel/closeup/CU20070828A/index...
を参考にしてください。
ありがとうございます.
上で紹介されたマクロが素晴らしかったので
結局試してはいませんがお忙しい中ありがとうございました.
ありがとうございます.
コメント欄の修正を反映したら完璧でした.
報告書にまとめるデータの整理に大いに役立ちます.