過去ログ

                                Page     546
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼マトリックスの作成。  杏 02/12/26(木) 13:30
   ┗Re:マトリックスの作成。  Jaka 02/12/26(木) 16:57
      ┗Re:マトリックスの作成。  杏 02/12/26(木) 17:58
         ┗Re:マトリックスの作成。  ゆと 02/12/26(木) 20:16
            ┗Re:マトリックスの作成。  杏 02/12/27(金) 9:55
               ┗Re:マトリックスの作成。  ゆと 02/12/27(金) 21:10
                  ┗Re:マトリックスの作成。  杏 02/12/30(月) 8:42
                     ┗Re:マトリックスの作成。  ゆと 03/1/7(火) 1:02
                        ┣Re:マトリックスの作成。  Jaka 03/1/7(火) 9:15
                        ┃  ┗ちょっと訂正  Jaka 03/1/7(火) 9:29
                        ┃     ┗Re:ちょっと訂正  杏 03/1/7(火) 12:25
                        ┗Re:マトリックスの作成。  杏 03/1/7(火) 12:20
                           ┗Re:マトリックスの作成。  ゆと 03/1/8(水) 1:46
                              ┗Re:マトリックスの作成。  杏 03/1/9(木) 12:31
                                 ┗Re:マトリックスの作成。  Jaka 03/1/10(金) 10:19
                                    ┣Re:マトリックスの作成。  ゆと 03/1/13(月) 15:14
                                    ┃  ┗Re:マトリックスの作成。  杏 03/1/15(水) 8:01
                                    ┗Re:マトリックスの作成。  杏 03/1/15(水) 8:04

 ───────────────────────────────────────
 ■題名 : マトリックスの作成。
 ■名前 : 杏
 ■日付 : 02/12/26(木) 13:30
 -------------------------------------------------------------------------
   いつもお世話になっております。

さて、ここに以下のようなデータがあります。
社員コード  名前   勤務地  属性
00145    たろう  横浜   2
00328    はなこ  東京   1
00221    じろう  大阪   2
00095    けんた  東京   3
00180    ひろみ  横浜   1

このデータを以下のようなマトリクスに置き換えたいのですが…。
勤務地/属性  1   2   3
東京     00328      00095
       はなこ     けんた

横浜     00180  00145
       ひろみ けんた

大阪         00221
          じろう

これは何かエクセルの機能で対応しているのでしょうか?それとも
マクロで配置できるのでしょうか?もしマクロで配置可能でしたら
教えて頂ければ幸いです。

よろしくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : Jaka  ■日付 : 02/12/26(木) 16:57  -------------------------------------------------------------------------
   ▼杏 さん:
>いつもお世話になっております。
>
>さて、ここに以下のようなデータがあります。
>社員コード  名前   勤務地  属性
>00145    たろう  横浜   2
>00328    はなこ  東京   1
>00221    じろう  大阪   2
>00095    けんた  東京   3
>00180    ひろみ  横浜   1
>
>このデータを以下のようなマトリクスに置き換えたいのですが…。
>勤務地/属性  1   2   3
>東京     00328      00095
>       はなこ     けんた
>
>横浜     00180  00145
>       ひろみ けんた
>
>大阪         00221
>          じろう

こんにちは。
回答ではないのですが、置換えた表の項目等に何か決まりがあるのでしょうか?
例えば
勤務地/属性 で、東京、横浜、大阪の順番になってますが。
出てくる基準は何ですか?

その辺りも詳しく書いておかないと、答え様が無いと思いますけど。
関数の達人なら関数だけで出来ちゃうような気もするけど...。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 02/12/26(木) 17:58  -------------------------------------------------------------------------
   ▼Jaka さん:
>こんにちは。
>回答ではないのですが、置換えた表の項目等に何か決まりがあるのでしょうか?
>例えば
>勤務地/属性 で、東京、横浜、大阪の順番になってますが。
>出てくる基準は何ですか?

説明不足で申し訳ありません。

勤務地と属性の欄は、既定と考えて頂ければOKです。
特に順番に基準はありません。

マトリックスに変換する時に、既定のフォームに落とし込む作業を
自動化できれば…と考えています。

よろしくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : ゆと  ■日付 : 02/12/26(木) 20:16  -------------------------------------------------------------------------
   杏さんこんばんは。
とりあえず、元記事を読んだ時点で組んでみたのでちょっと仕様と違う
かと思いますが。

いくつか疑問をあげておくと
○一つ、同一勤務地かつ、同一属性の場合はありえますか?
○属性は1〜nまでの数字データですか?

ちなみに、サンプルは、同一のモノがなく、数字データということを前提
にしてあります。
データはsheet1のA列から順に並んでいるとして、sheet2に変換後の形で
出力させてるつもりです。

冗長なところとかも結構あるので、他の人に回答をいただいた方がいいかも…。

Sub Exp()
Dim i%, j&, x&, y As Byte, ch_f As Byte
i% = 2
  With Sheets("sheet2")
    .Range("A1").FormulaR1C1 = "勤務地/属性"
    .Range("B1").FormulaR1C1 = "1"
    .Range("C1").FormulaR1C1 = "2"
    .Range("D1").FormulaR1C1 = "3"
  End With
  Do While Sheets("sheet1").Cells(i%, 1) <> "" And i% <= 21845
    j& = 2
    ch_f = 0
    Do While Sheets("sheet2").Cells(j&, 1).Value <> ""
      If Sheets("sheet2").Cells(j&, 1).Value = Sheets("sheet1").Cells(i%, 3).Value Then
        x& = j&
        ch_f = 1
        Exit Do
      End If
      j& = j& + 3
    Loop
    If ch_f = 0 Then
      x& = j&
      Sheets("sheet2").Cells(j&, 1).Value = Sheets("sheet1").Cells(i%, 3).Value
    End If
    y = CByte(Sheets("sheet1").Cells(i%, 4).Value) + 1
    With Sheets("sheet2").Cells(x&, y)
      .NumberFormatLocal = "00000"
      .Value = Sheets("sheet1").Cells(i%, 1)
      .HorizontalAlignment = xlCenter
    End With
    With Sheets("sheet2").Cells(x& + 1, y)
      .Value = Sheets("sheet1").Cells(i%, 2)
      .HorizontalAlignment = xlCenter
    End With

    i = i + 1
  Loop
End Sub
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 02/12/27(金) 9:55  -------------------------------------------------------------------------
   ▼ゆと さん:
返事が遅くなり、大変申し訳ありません。
今回のリストでは、ゆとさんのマクロで完璧でした。ありがとうございます!

>○一つ、同一勤務地かつ、同一属性の場合はありえますか?
実はあります。その場合、同じ行で一段下の列に反映させたいのですが、
そうすると、マトリックスの列が拡大してしまいます。これは仕方がないと
考えています。

>○属性は1〜nまでの数字データですか?
これは整数値になります。

いろいろ教えて頂き、本当に勉強になります。
よろしくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : ゆと  ■日付 : 02/12/27(金) 21:10  -------------------------------------------------------------------------
   杏さんこんばんは。

>>○一つ、同一勤務地かつ、同一属性の場合はありえますか?
>実はあります。その場合、同じ行で一段下の列に反映させたいのですが、
>そうすると、マトリックスの列が拡大してしまいます。これは仕方がないと
>考えています。
>
>>○属性は1〜nまでの数字データですか?
>これは整数値になります。
>
>いろいろ教えて頂き、本当に勉強になります。
>よろしくお願い致します。

以上の条件でマクロの修正版を作ったのですが、会社に忘れてきました(^^;
というわけで、本日で仕事納めだったため、回収してUPできるのは来年になり
ます…(苦笑)
そんなわけで、ごめんなさい。もう一度作ればいいだけなのですが、○○なので。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 02/12/30(月) 8:42  -------------------------------------------------------------------------
   ▼ゆと さん:
>以上の条件でマクロの修正版を作ったのですが、会社に忘れてきました(^^;
>というわけで、本日で仕事納めだったため、回収してUPできるのは来年になり
>ます…(苦笑)
>そんなわけで、ごめんなさい。もう一度作ればいいだけなのですが、○○なので。

おはようございます。
私は今日が仕事納めですが、あまりにも電車がガラガラでびっくりしてしまいました。
ゆとさん、いつもありがとうございます。
来年UPして頂けるのを楽しみに待っています。
良いお年をお迎えください。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : ゆと  ■日付 : 03/1/7(火) 1:02  -------------------------------------------------------------------------
   杏さんこんばんは。
お待たせしたくせに、期待にこたえられるかはわかりませんが一応
アップしてみます。
ご期待に答えられればいいのですが…

Sub Exp()
Dim i%, j&, x&, y As Byte, ch_f As Byte
i% = 2
  Application.ScreenUpdating = False
  With Sheets("sheet2")
    .Range("A1").FormulaR1C1 = "勤務地/属性"
    .Range("B1").FormulaR1C1 = "1"
    .Range("C1").FormulaR1C1 = "2"
    .Range("D1").FormulaR1C1 = "3"
  End With
  Do While Sheets("sheet1").Cells(i%, 1) <> "" And i% <= 21845
    j& = 2
    ch_f = 0
    Do While Sheets("sheet2").Cells(j&, 1).Value <> ""
      If Sheets("sheet2").Cells(j&, 1).Value = Sheets("sheet1").Cells(i%, 3).Value Then
        x& = j&
        ch_f = 1
        Exit Do
      End If
      j& = j& + 3
    Loop
    If ch_f = 0 Then
      x& = j&
      Sheets("sheet2").Cells(j&, 1).Value = Sheets("sheet1").Cells(i%, 3).Value
    End If
    y = CByte(Sheets("sheet1").Cells(i%, 4).Value) + 1
    If Sheets("sheet2").Cells(x&, y).Value = "" Then
      With Sheets("sheet2").Cells(x&, y)
        .NumberFormatLocal = "00000"
        .Value = Sheets("sheet1").Cells(i%, 1)
        .HorizontalAlignment = xlCenter
      End With
      With Sheets("sheet2").Cells(x& + 1, y)
        .Value = Sheets("sheet1").Cells(i%, 2)
        .HorizontalAlignment = xlCenter
      End With
    Else
      x& = x& + 3
      Do While Sheets("sheet2").Cells(x&, 1).Value = "TEMP"
        If Sheets("sheet2").Cells(x&, y).Value = "" Then
          With Sheets("sheet2").Cells(x&, y)
            .NumberFormatLocal = "00000"
            .Value = Sheets("sheet1").Cells(i%, 1)
            .HorizontalAlignment = xlCenter
          End With
          With Sheets("sheet2").Cells(x& + 1, y)
            .Value = Sheets("sheet1").Cells(i%, 2)
            .HorizontalAlignment = xlCenter
          End With
          ch_f = 2
          Exit Do
        End If
        x& = x& + 3
      Loop
      If ch_f <> 2 Then
        With Sheets("sheet2")
          .Range(Rows(x), Rows(x + 2)).Insert Shift:=xlDown
          .Cells(x&, 1).Value = "TEMP"
          With .Cells(x&, y)
            .NumberFormatLocal = "00000"
            .Value = Sheets("sheet1").Cells(i%, 1)
            .HorizontalAlignment = xlCenter
          End With
          With .Cells(x& + 1, y)
            .Value = Sheets("sheet1").Cells(i%, 2)
            .HorizontalAlignment = xlCenter
          End With
        End With
      End If
    End If

    i% = i% + 1
  Loop
  For i% = 2 To Sheets("sheet2").Cells(65536, 1).End(xlUp).Row Step 3
    If Sheets("sheet2").Cells(i%, 1).Value = "TEMP" Then Sheets("sheet2").Cells(i%, 1).Value = ""
  Next i%
  Application.ScreenUpdating = True
End Sub
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : Jaka  ■日付 : 03/1/7(火) 9:15  -------------------------------------------------------------------------
   おはようございます。
IV列を作業列として使っています。
属性Noは、1からNまでの連番である事が条件となっています。
ダブリチェックは、していません。

Sub MMMMM()
  Dim CEndRow As Long, Sh1 As Worksheet, Sh4 As Worksheet, Sh4ZokuCl As Long
  Dim Amatch As Variant, CCel As Variant, IVZoku As String, TB() As Long
  Dim Sh4EndCol As Long, WriteRow As Long, CCelSave As String
  Set Sh1 = Worksheets("Sheet1")
  Set ShW = Worksheets("Sheet4")
  CEndRow = Sh1.Cells(Rows.Count, "C").End(xlUp).Row
  ShW.Range("A1").Value = "勤務地/属性"
  For i = 1 To Application.Max(Sh1.Range("D2:D" & CEndRow))
    ShW.Cells(1, i + 1).Value = i
  Next
  Sh1.Range("IV2:IV" & CEndRow).Value = Sh1.Range("C2:C" & CEndRow).Value
  ShWEndCol = ShW.Cells(1, Columns.Count).End(xlToLeft).Column
  Do
    IVZoku = Sh1.Range("IV" & Sh1.Range("IV1").End(xlDown).Row).Value
    Set CCel = Sh1.Range("C1" & ":C" & CEndRow).Find(IVZoku, after:=Sh1.Range("C1"), LookAt:=xlWhole, MatchCase:=True)
    If Not CCel Is Nothing Then
     CCelSave = CCel.Address
     Do
       Amatch = Application.Match(CCel.Value, ShW.Columns("A"), 0)
       If IsError(Amatch) = True Then
        If ShW.Cells(Rows.Count, "A").End(xlUp).Row = 1 Then
          ShW.Range("A" & 2).Value = CCel.Value
        Else
          For II = 1 To ShWEndCol
            ReDim Preserve TB(1 To II)
            TB(II) = ShW.Cells(Rows.Count, II).End(xlUp).Row
          Next
          ShW.Range("A" & Application.Max(TB) + 2).Value = CCel.Value
          'ShW.Range("A" & ShW.UsedRange.Rows.Count + 2).Value = CCel.Value
        End If
       End If
       ShWZokuCl = Application.Match(CCel.Offset(, 1).Value, ShW.Range("A1", ShW.Cells(1, ShWEndCol)), 0)
       If ShW.Cells(Rows.Count, "A").End(xlUp).Row > ShW.Cells(Rows.Count, ShWZokuCl).End(xlUp).Row + 1 Then
        WriteRow = ShW.Cells(Rows.Count, "A").End(xlUp).Row
       Else
        WriteRow = ShW.Cells(Rows.Count, ShWZokuCl).End(xlUp).Row + 1
       End If
       ShW.Cells(WriteRow, ShWZokuCl).NumberFormatLocal = "00000"
       ShW.Cells(WriteRow, ShWZokuCl).Value = CCel.Offset(, -2).Value
       ShW.Cells(WriteRow + 1, ShWZokuCl).Value = CCel.Offset(, -1).Value
       Set CCel = Sh1.Range("C1" & ":C" & CEndRow).FindNext(CCel)
     Loop Until CCel.Address = CCelSave
     Sh1.Range("IV2:IV" & CEndRow).Replace What:=IVZoku, Replacement:=""
    Else
     Exit Do
    End If
  Loop
  Sh1.Columns("IV").Delete
  Erase TB
  Set Sh1 = Nothing
  Set ShW = Nothing
  Set CCel = Nothing
End Sub
 ───────────────────────────────────────  ■題名 : ちょっと訂正  ■名前 : Jaka  ■日付 : 03/1/7(火) 9:29  -------------------------------------------------------------------------
   >  Set ShW = Worksheets("Sheet4")

   ↓

Set ShW = Worksheets("Sheet2")

ここらへんのシート名は、仕様に合わせて変えて下さい。
 ───────────────────────────────────────  ■題名 : Re:ちょっと訂正  ■名前 : 杏  ■日付 : 03/1/7(火) 12:25  -------------------------------------------------------------------------
   Jakaさんありがとうございます。
おなじ属性のデータが複数ある場合にも対応してあり、
まさしく希望どおりのものとなりました。

本当にありがとうございます!
これからもよろしくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 03/1/7(火) 12:20  -------------------------------------------------------------------------
   ▼ゆと さん:

>          .Range(Rows(x), Rows(x + 2)).Insert Shift:=xlDown

のところで、エラーがでてしまうのですが、これは
xが何か宣言していないために起こるのでしょうか?
よろしくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : ゆと  ■日付 : 03/1/8(水) 1:46  -------------------------------------------------------------------------
   杏さんこんばんは。

>>          .Range(Rows(x), Rows(x + 2)).Insert Shift:=xlDown
>
>のところで、エラーがでてしまうのですが、これは
>xが何か宣言していないために起こるのでしょうか?
>よろしくお願い致します。

ここで使用している x は x& のことです。きちんと表記するのなら
 .Range(Rows(x&), Rows(x& + 2)).Insert Shift:=xlDown
となるはずでした。
ここで用いているxの後ろの"&"は変数の型を示すためのシンボルなので
xでもx&でも同様の処理が行われるはずでしたが…

確認した環境はwin2000/Excel2000 とwinXP/Excel2002 です。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 03/1/9(木) 12:31  -------------------------------------------------------------------------
   ▼ゆと さん:

>確認した環境はwin2000/Excel2000 とwinXP/Excel2002 です。

私のExcelは97−SR1でした…。
今時こんなの使っている人いないですね。すみません。

それで、x→x&に置き換えて、マクロを走らせたのですが、どうも
同じエラーメッセージが出てしまいます。
どのようにすればよいでしょうか?
いつも親切に教えて下さってありがとうございます。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : Jaka  ■日付 : 03/1/10(金) 10:19  -------------------------------------------------------------------------
   横レス失礼します。

実行状態に問題があるようです。
ゆとさんの書き方だとアクティブシートのみが対象になるようです。
たぶん、ゆとさんはSheet2をアクティブにした状態でテストされたんでしょう。
何で、こう言う状態でテストをして、このような書き方をしたのか解りませんが..。

Sheet2をアクティブにして実行されればエラーになりません。
私だったら下のように書くけど...。
これならSheet1とSheet2のどちらが選択されていても挿入されました。

.Range(Rows(x&), Rows(x& + 2)).Insert Shift:=xlDown
 ↓
.Rows(x& & ":" & x& + 2).Insert shift:=xlDown


>私のExcelは97−SR1でした…。
>今時こんなの使っている人いないですね。すみません。

私のも似たような物です。私のは、97−SR2です
2000年問題でのUP後、excel97自動再計算修正パッチって言うのを当てただけだと思う。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : ゆと  ■日付 : 03/1/13(月) 15:14  -------------------------------------------------------------------------
   Jaka さんこんにちは。
遅くなりましたが、フォローありがとうございます。

>実行状態に問題があるようです。
>ゆとさんの書き方だとアクティブシートのみが対象になるようです。
>たぶん、ゆとさんはSheet2をアクティブにした状態でテストされたんでしょう。

はい、去年組んだときにどうやらアクティブシートのみを対象にしていたようです。
原因は、ちょっと勘違いしてたことでした(^^;
杏さんごめんなさい〜。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 03/1/15(水) 8:01  -------------------------------------------------------------------------
   ▼ゆと さん:

返事が遅くなり大変申し訳ありませんでした。
おかげさまで、大変勉強になりました。
これからも、よろしくお願い致します。
 ───────────────────────────────────────  ■題名 : Re:マトリックスの作成。  ■名前 : 杏  ■日付 : 03/1/15(水) 8:04  -------------------------------------------------------------------------
   ▼Jaka さん:

ありがとうございます。これで問題なく挿入されました。
もうしばらく地道にExcel97で頑張ってみようかなと思いますので、
またいろいろ教えて頂ければ幸いです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 546