- ベストアンサー
エクセル2007にて表から
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
無理に関数でごり押しするより(出来ないとは言いませんが,お薦めはしません),マクロの方が遙かに簡単ですね。 作成例: sub macro1() dim h as range dim i as long dim target as range range("A13:A" & cells.rows.count).entirerow.delete shift:=xlshiftup on error resume next set target = range(range("D3"),cells(10, cells.columns.count)).specialcells(xlcelltypeconstants) if target is nothing then exit sub i = 12 for each h in target i = i + 1 cells(i, "B") = cells(2, h.column) cells(i, "C") = cells(1, "B") cells(i, "D") = cells(h.row, "B") cells(i, "E") = cells(h.row, "C") cells(i, "F") = h next end sub #あとは趣味に応じて,たとえばF13以下の降順で並べ替えたいとか書式を整えたいとか,諸々追加の修飾を新しいマクロの記録で記録したマクロなどを追記して完成させてください。
その他の回答 (1)
- imogasi
- ベストアンサー率27% (4737/17069)
こういう、「表のセルの組み換え問題」は、関数では難しいか複雑で不可能に近く、一方VBAでは、処理のポイント(定石)を経験すると簡単。 例データ B1:F8 -は空白セルを示す。左に詰めて表示されるのを防止のためで特に意味なし - X Y Z U a - 2 - - b - - - - c - - - - d - - 1 - e 2 1 1 - f - - - 1 g - - - 1 ーーー コード 標準モジュールに Sub test01() k = 2 '書き出し列(H,I,J列)の2行目から結果を書き出す Dim cl As Range For c = 3 To 6 'C列からF列までの各列について For Each cl In Range(Cells(2, c), Cells(20, c)) 'その列の各セルについて If cl <> "" Then '空白でないなら Cells(k, 10) = cl 'J列k行に値を代入 Cells(k, 8) = Cells(cl.Row, 2) 'H列k行にその行のB列の値を代入 Cells(k, 9) = Cells(1, c) ' 'I列k行にその列の第1行の値を代入 k = k + 1 '次の書き出しに備え、行を1行下を指す 'MsgBox cl End If Next Next c End Sub ーーーー 結果 H2:j9 e X 2 a Y 2 e Y 1 d Z 1 e Z 1 f Z 1 f U 1 g U 1 一部質問例の中身を省略した個所がある。 ・書き出し列やスタート行 ・データのある列で 質問者の場合は、どう変えればよいか勉強のこと。 コード(やり方)は珍しく思うかもしれないが、定石的なやり方の1つと思う。
お礼
貴重なお時間の中お答えくださいましてありがとうございました。