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

| 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のような数値もあります。

件数が数万件のため、マクロしかないのかなと思います。
よろしくお願いします。

A 回答 (3件)

>6#1の"6"は、その他に数字が違うもの(ex 11#1, 11#2など)、アルファベットのもの(ex AB#1, AB#2)があります



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

この回答への補足

早速のご回答ありがとうございます。

> ひとつのヘッダーに何件のデータがあって、次のヘッダー位置を取得してさらに次のヘッダーまでのデータを取得して・・・と延々と続くことになりますよね?

これについては、該当箇所を手作業で別シートに切り出すことで対応できますでしょうか。これで対応できるのであれば、手作業で切り出します。これ自体は件数がそれほど多いわけではないので、対応可能です。

よろしくお願いします。

例:
Sheet0 → 6#1~6#13、AB#1~AB#35などのデータが混在
Sheet1 → 6#1~6#13のデータだけが存在(Sheet0から切り出し)
Sheet2 → AB#1~AB#35のデータだけが存在(Sheet0から切り出し)

もちろんSheetを分けるだけでなくファイルを分けるのもOK

補足日時:2006/07/04 17:55
    • good
    • 0

現在のデータがあるシートが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
    • good
    • 0
この回答へのお礼

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

ありがとうございました!

お礼日時:2006/07/04 18:34

問題が良くわからない。


> 6#1 | 6#2 | 6#3 | ・・・などは、OKWAVEで多くのエクセルの質問を見てきたが、出くわしたことがない。
ーーーー
それで推測で
例データ
Sheet1のA1:J3
0010011111
0000000010
1001100100
のとき
結果
Sheet2の
3678910
9
1458
のように出したいのなら
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の行・列に左詰めでセットする。
    • good
    • 0

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