エクセルにてデータが同じものを横列に並べ替えたデータ
を作成したいのですがどなたか簡単に出来る方法を教えて
下さい。

元データ(A,Bとも文字データ)
A1 B1
A1 B2
A1 B3
A2 B1
A2 B3
A2 B4
A3 B1

を以下のように(Aが同じ場合に横にBを並べ替え)
A1 B1 B2 B3
A2 B1 B3 B4
A3 B1

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

皆さんの難しい式は読解しておりませんが、A列が仲間同士で並んでいなくても対応できるVBAコードです。


非連続セルをコピー貼り付けすると、エクセルが勝手に詰めてくれた事を思い出して組んでみました。
正統的でも、分かりやすくもないコードですが、ご参考まで。
’Sheet1のデータをSheet2に転記します。
Sub test()
Dim targetRange As Range, myCell As Range, destCell As Range
Dim myDic As Object, myKey As Variant

Set myDic = CreateObject("Scripting.Dictionary")
Set targetRange = Sheets("Sheet1").Range("A1").CurrentRegion
Set destCell = Sheets("Sheet2").Range("A1")
For Each myCell In targetRange.Columns(1).Cells
If Not myDic.exists(myCell.Value) Then
myDic.Add myCell.Value, myCell.Offset(0, 1)
Else
Set myDic.Item(myCell.Value) = Union(myDic.Item(myCell.Value), myCell.Offset(0, 1))
End If
Next myCell
For Each myKey In myDic.keys
destCell.Value = myKey
myDic.Item(myKey).Copy
destCell.Offset(0, 1).PasteSpecial Paste:=xlValues, Transpose:=True
Set destCell = destCell.Offset(1, 0)
Next myKey
Set myDic = Nothing
End Sub
    • good
    • 0

シート1のAおよびB列の2行目から下方にデータがあるとします。


シート1のC列は作業列としてC2セルには次の式を入力して下方にオートフィルドラッグします。

=IF(A2="","",IF(COUNTIF(A$2:A2,A2)=1,INT(MAX(C$1:C1)+1)+0.0001,INT(MAX(C$1:C1))+COUNTIF(A$2:A2,A2)*0.0001))

シート2にはお望みの表を作るとしてA2セルには次の式を入力して横方向にオートフィルドラッグしたのちに下方にもオートフィルドラッグします。

=IF(COUNTIF(Sheet1!$C:$C,ROW(A1)+0.0001)=0,"",IF(COLUMN(A1)=1,INDEX(Sheet1!$A:$A,MATCH(ROW(A1)+0.0001,Sheet1!$C:$C,0)),IF(COUNTIF(Sheet1!$C:$C,ROW(A1)+(COLUMN(A1)-1)*0.0001)=0,"",INDEX(Sheet1!$A:$B,MATCH(ROW(A1)+(COLUMN(A1)-1)*0.0001,Sheet1!$C:$C,0),2))))

この方法は配列数式にするなどの複雑なしかも計算に負担がかかるような方法を使用しておりません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
関数でもできるとこをがわかり大変勉強になりました。

お礼日時:2011/04/23 23:32

こんにちは!


一例です。
↓の画像のようにSheet1のデータをSheet2に表示するようにしてみました。

Sheet1に作業用の列を設けています。
作業列C2セルに
=IF(COUNTIF($A$2:A2,A2)=1,ROW(),"")
としてオートフィルでずぃ~~~!っと下へコピー!

Sheet2のA2セルに
=IF(COUNT(Sheet1!C:C)<ROW(A1),"",INDEX(Sheet1!A:A,SMALL(Sheet1!C:C,ROW(A1))))

B2セルに
=IF(OR($A2="",COUNTIF(Sheet1!$A:$A,$A2)<COLUMN(A1)),"",INDEX(Sheet1!$B$1:$B$1000,SMALL(IF(Sheet1!$A$1:$A$1000=$A2,ROW($A$1:$A$1000)),COLUMN(A1))))
(これは配列数式になってしまいますので、Shift+Ctrlキーを押しながらEnterキーで確定します。)

このB2セルを列方向にコピーしておきます。
最後にA2~最終列2行目を範囲指定し、下へオートフィルでコピーすると画像のような感じになります。

なればよいのですが・・・m(__)m
「EXCELで重複行の横並びについて教えて」の回答画像1
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
関数でもできるとこをがわかり大変勉強になりました。

この度は、図まで示していただきありがとうございました

お礼日時:2011/04/23 23:33

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qエクセル プルダウンの作り方

お世話になります。
エクセルでプルダウンの作り方を教えていただけませんでしょうか?
住所を▼のボタンでクリックしたら【北海道,青森,秋田,岩手・・・】などの選択ができるようにしたいのです。
宜しくお願いします。

Aベストアンサー

メニューから「データ」、「入力規則」、「設定」で「入力値の種類」を「リスト」を選択します。
そうすると「元の値」という表示がでますので、そこで前もって作っておいたリストの範囲を指定します。
多くないのでしたら、そのままそこにカンマで区切って入力しても出来ます。

QExcelシートの保護時にデータの並び替え

Excelシートの保護時にデータの並び替えを行いたいと考えています。
使用する予定のExcelは2003と2007です。

セルのデータを変更させたくないのでシートの保護を行うことになり、
その上でオートフィルタでの絞り込みや並び替えは使用したいという状況です。

Excelシートを保護する時のオプションで、次の4つにチェックをしました。
・ロックされたセル範囲の選択
・ロックされていないセル範囲の選択
・並べ替え
・オートフィルタの使用

オートフィルタの絞り込み表示は使用できましたが、並び替え時に保護の警告が表示されます。
シート上のセル全てのロックを解除して上記を行うと並び替えは出来るのですが、
データが変更できてしまうので意味がありません。

VBAでは制御可能という場合、マクロを無効にして起動された場合には
並び替えやオートフィルタが使用できなくなるので、出来るだけ避けたいと思います。

(できればVBAでの制御を行わずに、)
実現可能なのでしょうか?
教えて下さい。お願い致します。

Aベストアンサー

オートフィルタは使えるので問題は並べ替えだけです。
しかし保護されたセル範囲を並べ替える事はできません。なので実現は不可能です。

#シート保護時に「並べ替え」のチェックを入れなければ,そもそも並べ替えはできません
#チェックを入れても,保護されたセルを並べ替える事はできません
#保護されたシートで,保護されていないセル範囲だけが並べ替えできます。



ヤリタイ事の全てを実現したければ,マクロを併用し,有効にしないで開いたのでは何も出来ないよう仕込んでおくぐらいと思います。

作成例:
ThisWorkbookのシートに


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Worksheets("Sheet1").Protect Password:=123
ThisWorkbook.Save
End Sub

Private Sub Workbook_Open()
Worksheets("Sheet1").Unprotect Password:=123
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End Sub

などのように仕込み,さらにパスワードを見られないようにVBAProjectのプロパティで表示を保護しておくなどで。




#マクロからの操作は有効でシートを保護し,並べ替えだけマクロで行わせるような手もありますが,フツーの操作では出来ないという事なのでかえって使いにくいと考えます。

オートフィルタは使えるので問題は並べ替えだけです。
しかし保護されたセル範囲を並べ替える事はできません。なので実現は不可能です。

#シート保護時に「並べ替え」のチェックを入れなければ,そもそも並べ替えはできません
#チェックを入れても,保護されたセルを並べ替える事はできません
#保護されたシートで,保護されていないセル範囲だけが並べ替えできます。



ヤリタイ事の全てを実現したければ,マクロを併用し,有効にしないで開いたのでは何も出来ないよう仕込んでおくぐらいと思います。

作成...続きを読む

Qエクセルでプルダウンメニューの作り方

  エクセルの画面で、よく三角形を逆さまにした形をクリックするといくつかメニューが出てき、どれかを選べるようになっていますが、その作り方を教えてください。
 会社で人事を担当していますが、三角形(プルダウンボタン)をクリックすると社員氏名一覧が表示され、そこから選択できるようにしたいのです。
 しばらく自力でいろいろやってみましたが、さっぱり見当がつかず、どうやればいいのか分かりませんでした。よろしくお願いします。

Aベストアンサー

こんばんは!
当方使用のExcel2003での一例です!

↓の画像のようにSheet2に名簿表を作成しておきます。
画像ではSheet2のA2セル以降を範囲指定 → 名前ボックスに仮に「名簿」と入力しOK
これで範囲指定したセルが「名簿」と名前定義されましたので、

Sheet1のリスト表示させたいセルを範囲指定 → メニュー → データ → 入力規則
→ リスト → 「元の値」の欄に
=名簿
としてOK

これでSheet1のセルをアクティブにすると右側に下向き▼が表示されますので、そこをクリック!
これで希望に近い形にならないでしょうか?
Excel2007の場合は↓のURLが参考になるかもしれません。

http://www.eurus.dti.ne.jp/~yoneyama/Excel2007/excel2007-ny_kis2.html

尚、同一Sheetに「名簿表」を作成する場合は名前定義する必要はなくて
「元の値」の右側の四角をクリックし、リスト表示したいセルをそのまま範囲指定すればOKです。

以上、お役に立てば良いのですが・・・m(_ _)m

こんばんは!
当方使用のExcel2003での一例です!

↓の画像のようにSheet2に名簿表を作成しておきます。
画像ではSheet2のA2セル以降を範囲指定 → 名前ボックスに仮に「名簿」と入力しOK
これで範囲指定したセルが「名簿」と名前定義されましたので、

Sheet1のリスト表示させたいセルを範囲指定 → メニュー → データ → 入力規則
→ リスト → 「元の値」の欄に
=名簿
としてOK

これでSheet1のセルをアクティブにすると右側に下向き▼が表示されますので、そこをクリック!
これで希望に近い形にならない...続きを読む

QExcelの並び替えで、日付、時間、項目Bの順で並び替え

Excelの並び替えで、日付、時間、項目Bの順で並び替え
項目Aに特定の文字が入っていた場合は、優先的に一番最後にまわしたいのですが
どのように並び替え条件を指定すればいいのでしょうか?
※一番最後にまわすときも、日付、時間の順にしたいです。

■並び替えルール
日付、時間は昇順
項目Aは、海の人は最後に回す
項目Bは電話、メールの順(ユーザー設定済)

日付時間項目A項目B
1/110:00山電話
1/19:00山メール
1/112:00海電話
1/111:00海電話
1/18:00山メール

↓一発で下の順に並び替えたいのです。

日付時間項目A項目B
1/110:00山電話
1/18:00山メール
1/19:00山メール
1/111:00海電話
1/112:00海電話

Aベストアンサー

日付は最優先でその後は山、海の順、電話、メールの順のようですね。それぞれの項目に重みを付けて数値に置き換えます。それをもとに並び替えをすればよいでしょう。
例えば1行目は項目名としてE1セルには並び替えとでも文字を入力し、E2セルには次の式を入力し、下方にオートフィルドラッグします。

=IF(A2="","",A2+IF(C2="山",0.1,0.2)+IF(D2="電話",0.01,0.02)+B2*0.001)

E列の表示形式は標準にします。

次にA1セルからE列の最後の行までを範囲として選択したのちに、「並べ替えとフィルタ」から「ユーザー設定の並べ替え」を選択し、表示の画面で最優先されるキーに「並べ替え」とし「昇順」にしてOKすればよいでしょう。

Qエクセル(Excel) 納品書の作り方【画像修正版

昨日http://oshiete.goo.ne.jp/qa/7348426.htmlで質問させていただき、詳しくご回答いただき少し進んだのですが、状況が変わったので改めて質問させていただきます。

■エクセル(Excel)で納品書の作成をしています。
シート1に納品書、シート2に商品マスタ(一覧)を作っていて、シート2の一覧を反映させて
納品書に番号を打ち込むだけで、商品名・単価までが出るシステムを作りたいのですが、
昨日のご回答の中の「VLOOKUP」?を入れて、自分なりにマス目の数字を変えてやってみたのですが
反映されずN/?のようなエラーになってしまいます。

※画像が見にくかったのでシート<CENTER></CENTER>だけにしました。

1、上記のように、シート2との関連付けの係数を、写真の場合の数字で教えてください。

2、合計と、合計から20%を引いた数値を割り出す関数も、写真の数字で御願いします。

宜しくご教授お願い致します。

Aベストアンサー

こんばんは!
前回投稿した者です。

当方もかなり古い(人間も古い!なぁ~んちゃって!)Excel2003を使用しています。
↓の画像のようにSheet2にデータを作成しておきます。

#N/A というエラーは、「検索値」がない!ということですので
お示しの画像のB列にSheet2のA列にないデータを入力するとそういったエラーが表示されます。

画像のセル配置ですと
C4セルに
=IF($B4="","",VLOOKUP($B4,Sheet2!$A:$C,COLUMN(B1),0))
(「$」マークの位置に気を付けてください)
という数式を入れD4セルまでオートフィルでコピー!
そのまま最後の24行目までコピーしておきます。

F4セルには
=IF(COUNTBLANK(B4:E4),"",D4*E4)
という数式を入れ、F24までオートフィルでコピー!

これでB列に商品番号を入力すればSheet2のデータが反映され、
E列に数量を入力でF列に金額が表示されると思います。

最後に合計金額のF26セルは
=IF(COUNT(F4:F24),SUM(F4:F24),"")
手数料のF27セルは
=IF(F26="","",F26*0.2)

これで何とか形にならないでしょうか?

※ 振込金額の欄は不明ですので手を付けていません。

参考になりますかね?m(_ _)m

こんばんは!
前回投稿した者です。

当方もかなり古い(人間も古い!なぁ~んちゃって!)Excel2003を使用しています。
↓の画像のようにSheet2にデータを作成しておきます。

#N/A というエラーは、「検索値」がない!ということですので
お示しの画像のB列にSheet2のA列にないデータを入力するとそういったエラーが表示されます。

画像のセル配置ですと
C4セルに
=IF($B4="","",VLOOKUP($B4,Sheet2!$A:$C,COLUMN(B1),0))
(「$」マークの位置に気を付けてください)
という数式を入れD4セルまでオートフィルで...続きを読む

Qエクセルで横並びのデータを縦にしたいのですが・・・

以下の様な月別のシートが大量にあり、それをひとつのシートに縦にまとめたいと思っています。

日付 1課  2課  3課  東京   大阪 ......
10/1 20   10   15   50   30
10/2 15   20        45  
10/3 30   15    20   30   35
 :
これを

日付 部署  数量
10/1 1課  20
10/1 2課  10
10/1 3課  15
10/1 東京  50
10/1 大阪  30
10/2 1課  15
10/2 2課  20
10/2 3課   0
10/2 東京  45
    :
と、この様な形にしたいのですがやり方がわかりません。
実際のデータは縦31行、横30列(縦横共に固定)、シート枚数40ほど有り、
コピー&ペーストではなかなか作業が終わりません。
マクロは基本的なことしかわかりません。
作業はシート単位で、簡単なやり方があればご教授お願いいたします。

Aベストアンサー

こんばんは!

Sheet見出しの一番左から最後のSheetまですべて同じ配置ですよね?
各シートのA1セルに項目の「日付」が入っているという前提です。

標準モジュールにしてみてください。

Sub Sample1() 'この行から//
Dim i As Long, j As Long, k As Long, cnt As Long, lastCol As Long
For k = 1 To Worksheets.Count
With Worksheets(k)
On Error Resume Next '←念のため
lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
With .Cells(1, lastCol + 1)
.Value = "日付"
.Offset(, 1) = "部署"
.Offset(, 2) = "数量"
End With
.Columns(lastCol + 1).NumberFormatLocal = .Range("A2").NumberFormatLocal
cnt = 1
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
For j = 2 To lastCol
cnt = cnt + 1
.Cells(cnt, lastCol + 1) = .Cells(i, "A")
.Cells(cnt, lastCol + 2) = .Cells(1, j)
If .Cells(i, j) <> "" Then
.Cells(cnt, lastCol + 3) = .Cells(i, j)
Else
.Cells(cnt, lastCol + 3) = 0
End If
Next j
Next i
Range(.Columns(1), .Columns(lastCol)).Delete
End With
Next k
End Sub 'この行まで//

※ 一旦マクロを実行すると元に戻せませんので
ブック全体をコピーし、コピーしたブックで試してみてください。m(_ _)m

こんばんは!

Sheet見出しの一番左から最後のSheetまですべて同じ配置ですよね?
各シートのA1セルに項目の「日付」が入っているという前提です。

標準モジュールにしてみてください。

Sub Sample1() 'この行から//
Dim i As Long, j As Long, k As Long, cnt As Long, lastCol As Long
For k = 1 To Worksheets.Count
With Worksheets(k)
On Error Resume Next '←念のため
lastCol = .Cells(1, Columns.Count).End(xlToLeft).Column
With .Cells(1,...続きを読む

Qエクセル(Excel) 納品書の作り方【改めて】

昨日http://oshiete.goo.ne.jp/qa/7348426.htmlで質問させていただき、詳しくご回答いただき少し進んだのですが、状況が変わったので改めて質問させていただきます。

■エクセル(Excel)で納品書の作成をしています。
シート1に納品書、シート2に商品マスタ(一覧)を作っていて、シート2の一覧を反映させて
納品書に番号を打ち込むだけで、商品名・単価までが出るシステムを作りたいのですが、
昨日のご回答の中の「VLOOKUP」?を入れて、自分なりにマス目の数字を変えてやってみたのですが
反映されずN/?のようなエラーになってしまいます。

※画像が貼り付けてあります。商品名は1番以外伏せさせていただいています。
くっつけてありますが、左側がシート1・右側がシート2です。

1、上記のように、シート2との関連付けの係数を、写真の場合の数字で教えてください。

2、合計と、合計から20%を引いた数値を割り出す関数も、写真の数字で御願いします。

宜しくご教授お願い致します。

Aベストアンサー

画像がいまいちよく見えないのですが、納品書の項目は左から、No、商品番号、商品名、単価、数量、金額でいいのでしょうか(名前は多少違っていても意味があっていればもんだいないです)

でしたら、
C1セルに=IF(ISBLANK(B2),"",VLOOKUP(B2,Sheet2!$A$2:$C$200,2,FALSE))
D1セルに=IF(ISBLANK(B2),"",VLOOKUP(B2,Sheet2!$A$2:$C$200,3,FALSE))
E1セルは空白で
F1セルに=IF(D2="","",D2*E2)
といれて、C1からF1までをコピーしてその下の行にタテに貼り付ければ出来ますよ。
おそらくエラーが出たのは、コピーしたときにVLOOKUP関数の最初のセルの指定がずれてしまっているのでは無いかと思いますよ。     

QEXCELで条件に合致したデータから、さらに重複するデータを1と数える

EXCELで条件に合致したデータから、さらに重複するデータを1と数える
ことが関数で出来るでしょうか?

例えば
  A ,B ,C
1 見積No 、担当者、商品名
2 111、山田、パソコン
3 111、山田、プリンタ
4 222、佐藤、HDD
5 333、山田、パソコン
6 444、青木、パソコン
7 555、山田、HDD

パソコンの担当者ごとの見積もり件数はという問いに対して
 山田 2件
 佐藤 0件
 青木 1件
という解答を求めたいのです。
見積Noが同じ場合は同じ見積書で明細が2行の場合で、これを1件と数えたいのです。
フィルタで絞った後に、=SUMPRODUCT(1/COUNTIF(A2:A100,A2:A100))
という関数を試しましたが、フィルタを無視して全ての件数が対象となってしまいました。
SUMに対するSUBTOTAL関数のようなものがあれば便利だったのですが…。

うまく質問出来たのか不安ですが、判る方お願いします。 m(__)m
 

Aベストアンサー

こんにちは!
外していたらごめんなさい。

↓の画像のようにSheet1のデータをSheet2にまとめるようにしてみました。
Sheet2のC2セルに検索商品名を入力すると、B列に件数を表示させるようにしています。
Sheet2の氏名欄はあらかじめ入力されているものとします。

Sheet1の作業用の列を2行使わせてもらっています。
D2セルに
=A2&C2
E2セルに
=IF(OR(Sheet2!$C$2="",C2<>Sheet2!$C$2,COUNTIF($D$2:D2,D2)<>1),"",ROW(A1))
として、D2・E2セルを範囲指定し、E2セルのフィルハンドルで下へずぃ~~~!っとコピーします。

そして、Sheet2のB2セルに
=IF(A2="","",SUMPRODUCT((Sheet1!$B$2:$B$100=A2)*(Sheet1!$E$2:$E$100<>"")))
という数式を入れ、オートフィルで下へコピーしています。

尚、数式はSheet1の100行目まで対応できるようにしていますが、
データ量によって範囲指定の領域はアレンジしてみてください。

以上、参考になれば幸いですが
的外れなら読み流してくださいね。m(__)m

こんにちは!
外していたらごめんなさい。

↓の画像のようにSheet1のデータをSheet2にまとめるようにしてみました。
Sheet2のC2セルに検索商品名を入力すると、B列に件数を表示させるようにしています。
Sheet2の氏名欄はあらかじめ入力されているものとします。

Sheet1の作業用の列を2行使わせてもらっています。
D2セルに
=A2&C2
E2セルに
=IF(OR(Sheet2!$C$2="",C2<>Sheet2!$C$2,COUNTIF($D$2:D2,D2)<>1),"",ROW(A1))
として、D2・E2セルを範囲指定し、E2セルのフィルハンドルで下へずぃ~~~!...続きを読む

Qエクセル2007でプルダウンで選んだものに反応

Excel2007でプルダウンで選んだものに反応して隣のセルが自動入力される方法(エクセル2007)
A1をプルダウンで「猫」「犬」から選べるようにし、「猫」を選んだ場合B1に自動に「111」が、「犬」を選んだ場合B1に自動に「222」と入力されるようにしたいです。
ご教授の程、宜しくお願いします。

Aベストアンサー

VLOOKUP関数での方法です。
(1)別シートに入力文字列と対応コード表を作成。(仮にSheet2のA:B列範囲で順不同)
(2)B1に=IF(COUNTIF(Sheet2!A:A,A1),VLOOKUP(A1,Sheet2!A:B,2FALSE),"")を設定
   入力文字列が存在しない場合は空白としています。

QExcelにおける数値の並び替え

添付図に示すように、左側に縦に並んだ系列A~系列Eの5種類のデータを
右側のように横に並び替える方法を教えてください。
この例では各系列のデータは100個としていますが、実際には数万データあります。
excel2002を使用しています。
宜しくお願いいたします。

Aベストアンサー

E7: =INDEX($B$7:$B$50000,(ROW(A1)-1)*5+COLUMN(A1))


人気Q&Aランキング