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

システムの仕様で、大量のExcelデータを変換する
必要があります。
添付画像がイメージです。左の表から右の表
に変換したいのですが、関数もしくはマクロを使って効率的な変換する方法を教えて下さい、
よろしくお願いします。

「【至急 詳しい方教えて下さい】Excel」の質問画像

質問者からの補足コメント

  • ありがとうございます。

    1.2 左右どちらも同じシートでsheet1です。
    3.左側のセル〈11111)はA1です
    4.右側のセル〈11111)はF1です
    5.左側の行数は1000行です。

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/04/21 20:58

A 回答 (6件)

以下のマクロを標準モジュールに登録してください。



Option Explicit
Public Sub 並べ替え()
Dim ws As Worksheet
Dim maxrow As Long
Dim row1 As Long
Dim row2 As Long
Dim col As Long
Set ws = Worksheets("Sheet1")
maxrow = ws.Cells(Rows.count, "A").End(xlUp).row 'A列の最大行取得
ws.Columns("F:G").ClearContents
row2 = 1
For row1 = 1 To maxrow
For col = 2 To 4
If ws.Cells(row1, col).Value <> "" Then
ws.Cells(row2, "F").Value = ws.Cells(row1, "A").Value
ws.Cells(row2, "G").Value = ws.Cells(row1, col).Value
row2 = row2 + 1
End If
Next
Next
End Sub
    • good
    • 0
この回答へのお礼

早急にありがとうございます。めっちゃ簡単にできました。助かりました。また困ったら投稿すると思いますので、またよろしお願いします

お礼日時:2022/04/23 07:17

バージョンは何をお使いですか?


(できれば最初から書いておいてほしい)
    • good
    • 0

恥ずかしながら、マクロ音痴で初心者な私の場合は次の方法しか思い浮かびません。

(*^_^*)

式 =COUNTA(B1:D1) を入力したセル E1 のフィルハンドルを下方に(数値
0 が表示されるまで)オートフィル⇒式↓
=OFFSET(A$1,(ROW(A1)-1)/MAX($F:$F),) を入力したセル F1 を右隣に
オートフィル⇒コピーされたセル G1 の式を下記のように編集

=OFFSET(A$1,(ROW(A1)-1)/MAX($E:$E),)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
=OFFSET(B$1,(ROW(A1)-1)/MAX($E:$E),MOD(ROW(A1)-1,MAX($E:$E)))

続いて、範囲 F1:G1 のフィルハンドルを下方にズズズーッと(両列のデータが数値 0 を呈するまで)オートフィル

結果を添付図に示した。

更に続いて、列範囲 F:G を選択⇒Ctrl+C⇒選択状態のままの列範囲 F:G 上
でマウスの右クリック⇒[貼り付けのオプション]直下の[123](値)アイコンを
ツン⇒G列を選択⇒Ctrl+G⇒[セル選択]⇒“定数”に目玉入れた後で数値以外に
付いているチェック外し⇒[OK]をツン⇒ 選択された数値 0 の任意のセル上
でマウスの右クリック⇒[削除]⇒“行全体”に目玉入れ⇒[OK]を「エイヤッ!」
と叩き付け
「【至急 詳しい方教えて下さい】Excel」の回答画像5
    • good
    • 1
この回答へのお礼

早急にありがとうございます。
簡単にできました。今後も参考にさせていただきます。また困ったら投稿させてもらうかもしれないので、宜しくお願いします

お礼日時:2022/04/23 07:15

こんばんは



同じ内容の質問を何度か見かけた記憶があります。
ですので、検索すればいろいろな解決方法が見つかると思います。

>関数もしくはマクロを使って効率的な変換する方法を教えて下さい、
関数でも可能と思いますが、セル位置がまったくわからないので、具体的には示せません。
上の行から順に、「値のある列のセル」を参照してゆき、その累積個数の行にそのセルの値のペアを記入すればよいことになります。
記入する行番号から元のデータ位置を計算するには、値の個数はCOUNTIFやCOUNTAで数えられますので、それを行ごとに累計した数を求め、行番号を超えない最大の順番の行が転記の対象行となり、「行番号 - 累計値」が列の番号として求めることができます。
位置が計算できれば、そのセルの値を参照すれば良いだけになります。

マクロの場合はもっと簡単に、行と列の2重ループ内で、記入する毎に記載対象行を1ずつ増加してゆけばすみます。


方法についてのご質問なので、上記で十分と思いますが、文章での回答の意味を読み取れない人が非常に多いので、以下にマクロの例を。

※ セル位置がまったく不明なので、勝手にA1セルからデータがあるものと解釈。
※ 途中に空白セルがある場合には、そのセルは飛ばします。
※ そのまま書き換えますので、コピーしてから試すなりしてください。

Sub Q12911128()
Dim rang As Range, v
Dim rw As Long, col As Long

v = ActiveSheet.UsedRange.Value
Set rng = Range("A1:B1")
Cells.ClearContents

For rw = 1 To UBound(v)
If v(rw, 1) <> "" Then
For col = 2 To UBound(v, 2)
If v(rw, col) <> "" Then
rng(1).Value = v(rw, 1)
rng(2).Value = v(rw, col)
Set rng = rng.Offset(1)
End If
Next col
End If
Next rw
End Sub

※ あくまでも例なので、対象を指定範囲にするとか、別シートに書き出すなどは、ご自由に改変してください。
    • good
    • 0
この回答へのお礼

早急にありがとうございます。この方法でもうまくいきました。また困ったら投稿すらと思いますので、その際は宜しくお願いします

お礼日時:2022/04/23 07:20

補足要求です。


1.左側のシートのシート名は何ですか。
2.右側のシートのシート名は何ですか。
3.左側のシートの正確なレイアウトがわかりません。
一番左上のセル(11111)はA1でしょうか。
4.右側のシートの正確なレイアウトがわかりません。
一番左上のセル(11111)はA1でしょうか。
5.左側のシートの行数はおよそ何行ありますか。
この回答への補足あり
    • good
    • 0

こんばんは。



直接の回答ではありませんが、Excel VBA データ 縦に並べる で検索すると
 例えば、下記の様なものが見付かります。
 シート1のデータを、シート2へ展開するマクロの様ですが。

https://oshiete.goo.ne.jp/qa/7159851.html
    • good
    • 1
この回答へのお礼

早急にありがとうございました。
また困ったら投稿するので、その際は宜しくお願いします

お礼日時:2022/04/23 07:22

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