EXCELに関する質問です.

現在A1に「あ」,A2に「い」,A3に「う」と入っています.
この時にB1とB2に「あ」,B3とB4に「い」,B5とB6に「う」
といった感じに簡単に入力する方法を教えてください.
実際のデータは3行ではなく10行程度あり,
それを隣の列に上記のように入力したいわけです.
可能ならば一番上のセルに関数等を入力後に
オートフィルでドラッグするだけでよい方法が理想です.
よろしくお願いします.

回答の条件
  • 1人2回まで
  • 登録:2007/08/30 10:56:47
  • 終了:2007/08/30 15:42:47

ベストアンサー

id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912007/08/30 12:24:49

ポイント150pt

やはりマクロの方が簡単なようなので、マクロでの回答例です。


コメントの仕様をベースにしました。

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 を実行してください。

元のテーブルの右側に御所望のテーブルが作成されるかと思います。


不明な点は、コメントでご質問ください。

id:ryo220

ありがとうございます.

コメント欄の修正を反映したら完璧でした.

報告書にまとめるデータの整理に大いに役立ちます.

2007/08/30 15:40:54

その他の回答(3件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/08/30 11:04:16

ポイント30pt

B1に

=INDIRECT("A"&INT((ROW() +1)/2))

で、B1をコピー、必要な範囲を選択して貼り付けでどうでしょうか。

id:ryo220

ありがとうございます.

例の挙げ方が悪かったのですが,

実際のデータはA4~A9まで,A18~22まで,A32~A36までと

複数のブロックがあるものなので

=INDIRECT("A"&INT((ROW()+4)/2))

として使ってみました.

ただこの場合は最初のブロックはうまくいきますが,

次のブロックは「+18」に直さないとうまく表現されませんでした.

これを一つの式であとはコピペするだけにできないものでしょうか?

2007/08/30 11:41:01
id:rikuzai No.2

りくっち回答回数1366ベストアンサー獲得回数1412007/08/30 11:08:38

ポイント30pt

例示の通りの場合、

B1=INDIRECT("A"&ROUND(ROW()/2,0))

以下フィルコピーでご希望の表示が出来ると思います。


http://www.officetanaka.net/excel/function/function/indirect.htm

id:ryo220

ありがとうございます.

例の挙げ方が悪かったのですが,

実際のデータはA4~A9まで,A18~22までと

複数の表があるものなので

=INDIRECT("A"&ROUND(ROW()/2+3,0))

として使ってみました.

ただこの場合は最初のブロックはうまくいきますが,

次のブロックは「+17」に直さないとうまく表現されませんでした.

これを一つの式であとはコピペするだけにできないものでしょうか?

2007/08/30 11:39:26
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912007/08/30 12:24:49ここでベストアンサー

ポイント150pt

やはりマクロの方が簡単なようなので、マクロでの回答例です。


コメントの仕様をベースにしました。

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 を実行してください。

元のテーブルの右側に御所望のテーブルが作成されるかと思います。


不明な点は、コメントでご質問ください。

id:ryo220

ありがとうございます.

コメント欄の修正を反映したら完璧でした.

報告書にまとめるデータの整理に大いに役立ちます.

2007/08/30 15:40:54
id:kaiton No.4

kaiton回答回数260ベストアンサー獲得回数342007/08/30 12:56:44

ポイント30pt

作業列を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...

を参考にしてください。

id:ryo220

ありがとうございます.

上で紹介されたマクロが素晴らしかったので

結局試してはいませんがお忙しい中ありがとうございました.

2007/08/30 15:40:49
  • id:taknt
    A列の文字列に ソートキーをつけたのを B列に貼り付け その後ろにもう一度 貼り付け
    B列でソートしなおして ソートキーを削除

    B列は 別のシートにしたほうがいいかも。
    ソートキーを削除してから 元のシートに貼り付ければいいでしょう。
  • id:Mook
    1対1の対応ならそれも可能ですが、今回の場合は1対2なので、必ずどこかに基準となるセルが存在します。

    それを他のセルで指定するようなことは可能ですが、表の範囲に規則性はあるのでしょうか。

    A4~A9まで,A18~22まで・・・、以降の部分の規則を明示いただければ対応も可能かと思います。
  • id:takejin
    関数じゃ、そりゃ無理でしょう。
    VBA、マクロじゃないと
  • id:Mook
    まぁ、マクロの方が簡単でしょうね。
  • id:ryo220
    実際のデータは

    |*厚み|*密度|
    |10.4|0.20|
    |10.2|0.15|
    |10.6|0.10|
    |10.5|0.15|
    |10.7|0.20|

    という表から

    |*厚み累計|*密度|
    |0.0|0.20|
    |10.4|0.20|
    |10.4|0.15|
    |20.6|0.15|
    |20.6|0.10|
    |31.2|0.10|
    |31.2|0.15|
    |41.7|0.15|
    |41.7|0.20|
    |52.4|0.20|

    という表を生成したいのです.
    厚み累計と密度は別の表で計算してあるので
    質問したような方法で下の表を完成させたいと思います.

    そのため基準セルは各ブロックの左上隅になります.
    基準行が変わったときの行番号を変数として関数に取り込めれば
    一つ設定したものをコピペで何とかなると思うのですが
    どうやってもうまいのが思いつきません.
    アドバイスよろしくお願いします.
  • id:rikuzai
    ↑だと、1行目に0.0を入れないといけないですよね。
    これで関数の場合もう狂ってきちゃいます…。
    少し時間できたら再チャレンジしてみますので、
    しばらくお待ちいただけるようならまだ締めないでおいてください。
  • id:rikuzai
    Mookさんのマクロで十分みたいですね。
    離脱します~
  • id:rikuzai
    ・・・と思ったらちょっとおかしいですね。
    全てA列の数値を基準に算出してしまうようです。
  • id:kaiton
    作業列2列を使った関数の例、できたので参考まで回答しました。
    C5 =IF(B4<>"",IF(ISNUMBER(B4),"",ROW()),"") >数字データの最初の行数を求める(1行上は文字データ?としている)
    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列が希望のデータだと思います。
  • id:Mook
    ん?
    どこでしょうか。

    例えばテーブルが D11:E20 にあって、D11を選択してから実行すれば
    F11:G30 に結果がでませんか?
  • id:Mook
    わかりました。
    ご指摘ありがとうございます。


    baseRange.Offset(2 * i, 3).Value = baseRange.Offset(i, 0).Value
    baseRange.Offset(2 * i + 1, 3).Value = baseRange.Offset(i, 0).Value



    baseRange.Offset(2 * i, 3).Value = baseRange.Offset(i, 1).Value
    baseRange.Offset(2 * i + 1, 3).Value = baseRange.Offset(i, 1).Value

    でした。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません