• ベストアンサー

EXCELのデータ整形

| 6#1 | 6#2 | 6#3 | 6#4 | 6#5 | 6#6 | 6#7 | 6#8 | ------------------------------------------------------------------ | 0  | 0  | 1  | 0  | 1  | 0  | 0  | 1  | ------------------------------------------------------------------ | 0  | 0  | 0  | 0  | 0  | 0  | 1  | 0  | ------------------------------------------------------------------ この"0" or "1" 型式の表を、 以下のような、型式に変換したいと考えています。 つまり、"1"が入っているセルの1行目の#に付随する数値を、 左詰で入力する型式です。 | 6#1 | 6#2 | 6#3 | 6#4 | 6#5 | 6#6 | 6#7 | 6#8 | ------------------------------------------------------------------ | 3  | 5  | 8  |    |    |    |    |    | ------------------------------------------------------------------ | 7  |    |    |    |    |    |    |    | ------------------------------------------------------------------ 6#1の"6"は、その他に数字が違うもの(ex 11#1, 11#2など)、 アルファベットのもの(ex AB#1, AB#2)があります。 逆に、#1の"1"の部分が違うものになることはありません。 必ず1から始まる数値の連番になっています。終わりの数値は 8とは限らず、25や120のような数値もあります。 件数が数万件のため、マクロしかないのかなと思います。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

現在のデータがあるシートがSheet1だとします。 Sheet2に整形?後のデータを貼り付けるサンプルを作成してみました。 Sub test01() Dim c, r, n, i, ii Set s1 = Sheets("Sheet1") Set s2 = Sheets("Sheet2") c = s1.UsedRange.Cells(s1.UsedRange.Count).Column r = s1.UsedRange.Cells(s1.UsedRange.Count).Row For n = 2 To r ii = 1 For i = 1 To c If s1.Cells(n, i) = 1 Then s2.Cells(n, ii) = Mid(s1.Cells(1, i), InStrRev(s1.Cells(1, i), "#") + 1) ii = ii + 1 End If Next i Next n End Sub

noritaro
質問者

お礼

早速返信いただき、ありがとうございます。 上記コードを試してみましたが、見事意図通りの完璧な結果になりました。 ありがとうございました!

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.3

問題が良くわからない。 > 6#1 | 6#2 | 6#3 | ・・・などは、OKWAVEで多くのエクセルの質問を見てきたが、出くわしたことがない。 ーーーー それで推測で 例データ Sheet1のA1:J3 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 0 0 のとき 結果 Sheet2の 3 6 7 8 9 10 9 1 4 5 8 のように出したいのなら Sheet2mのA1に =IF(COLUMN(A1)<=SUM(Sheet1!$A1:$J1),SMALL(IF(Sheet1!$A1:$J1=1,COLUMN($A1:$J1),""),COLUMN(A1)),"") と入れてSHIFT+CTRL+ENTERを同時に押す。配列数式。 J1まで+ハンドルをヒッぱり、A1:J1を範囲指定してJ1で+ハンドルを出して第3行まで引っ張る。 配列数式の威力を感ずる問題でした。 ーーーー 上記は相当技巧的です。 VBAでプログラムを組めば素直な問題として解けます。 (各行について)AからJ列まで1であるか判別を繰り返す。 1ならその列番をSheet2の行・列に左詰めでセットする。

  • ipsum11
  • ベストアンサー率21% (55/251)
回答No.1

>6#1の"6"は、その他に数字が違うもの(ex 11#1, 11#2など)、アルファベットのもの(ex AB#1, AB#2)があります ひとつのシートにってことですか?そうなると少し面倒になると思います。 提示された例のように、A1から横方向に6#1から順に入っていき、A2以降にデータがあるのであれば簡単にできると思います。 しかしヘッダー(「6#1」の事です。勝手にこう呼びます)が複数だと、ひとつのヘッダーに何件のデータがあって、次のヘッダー位置を取得してさらに次のヘッダーまでのデータを取得して・・・と延々と続くことになりますよね? データの件数やヘッダーの件数に規則性があるのであればより簡単にできると思いますがいかがでしょうか?

noritaro
質問者

補足

早速のご回答ありがとうございます。 > ひとつのヘッダーに何件のデータがあって、次のヘッダー位置を取得してさらに次のヘッダーまでのデータを取得して・・・と延々と続くことになりますよね? これについては、該当箇所を手作業で別シートに切り出すことで対応できますでしょうか。これで対応できるのであれば、手作業で切り出します。これ自体は件数がそれほど多いわけではないので、対応可能です。 よろしくお願いします。 例: Sheet0 → 6#1~6#13、AB#1~AB#35などのデータが混在 Sheet1 → 6#1~6#13のデータだけが存在(Sheet0から切り出し) Sheet2 → AB#1~AB#35のデータだけが存在(Sheet0から切り出し) もちろんSheetを分けるだけでなくファイルを分けるのもOK

関連するQ&A

専門家に質問してみよう