Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2007/1/6 ユーザー名 : a ' Select Case Range("B1").Value Case Is = "": MsgBox "選択された主成分の数をオレンジのセルに入れてください" Case Else: PCAsoubetu End Select Range("B1").Select End Sub Sub PCAsoubetu() ' '主成分層別法 Ver.1_1 '改定履歴 '2007.1.18 各主成分の32%値について層別作業を手動から自動にした Dim x!, p%, rownow%, colnow%, rowend%, datasu%, skijyun!, rowdown$, xcount%, S_PCA!, columnend%, score32! Dim PCAnow$ 'x: スキャン時の各主成分スコア値 'p: 主成分スコア列のスキャン作業用 'rownow: 作業用。現在の行番号 'colnow: 作業用。現在の列番号 'rowend: 入力データの最下行の行番号 'rowdown$: Range領域指定用の文字列式 'skijyun: 主成分層別基準数 (両側32%値を推奨) 'datasu: データの組数 'S_PCA!: 選択した主成分数 'PCAnow: 各主成分の層別名称 Range("C3").Select Selection.End(xlDown).Select rowend% = ActiveCell.Row datasu% = Cells(rowend%, 1).Value Selection.End(xlToRight).Select columnend% = ActiveCell.Column 'データ範囲の取得 end rowdown$ = "B3:B" & CStr(rowend%) With ActiveSheet .Cells(3, 2).Value = "" .Range(rowdown$).FillDown End With '主成分層別指標ゾーンのクリア end '主成分スコアの絶対値ソートと32%値抽出 '初期条件設定 score32! = CInt(datasu% * 0.32) '両側基準値を変えたい時は0.32の数値をかえると変更可能。 Range("C3").Select rownow% = ActiveCell.Row colnow% = ActiveCell.Column S_PCA! = Cells(1, 2).Value For p% = 1 To S_PCA! '絶対値へ変換 Do Until rownow% = rowend% + 1 Range(Cells(rownow%, columnend% + 1), Cells(rownow%, columnend% + 1)).Select ActiveCell.Value = Abs(Cells(rownow%, colnow%).Value) rownow% = rownow% + 1 Loop '降順へ ソート Range(Cells(3, columnend% + 1), Cells(rowend%, columnend% + 1)).Select Selection.Sort Key1:=Range(Cells(3, columnend% + 1), Cells(3, columnend% + 1)), Order1:=xlDescending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin '両側32%出現値の選択と記入 Cells(rownow% + 1, colnow%).Value = Cells(2 + score32!, columnend% + 1).Value rownow% = 3 colnow% = colnow% + 1 Next p% '画面清掃 Selection.Clear Range("B1").Select Cells(rowend% + 2, 1).Value = "両側32%スコア値" '主成分層別作業開始 Range("C3").Select rownow% = ActiveCell.Row colnow% = 3 skijyun! = Cells(rowend% + 2, colnow%).Value For p% = 1 To Cells(1, 2).Value '主成分の背番号分類作業 Do x! = Cells(rownow%, colnow%).Value If Abs(x!) < skijyun! Then Cells(rownow%, 2).Value = Cells(rownow%, 2).Value & "" Else Cells(rownow%, 2).Value = Cells(rownow%, 2).Value & Str(p%) rownow% = rownow% + 1 Loop Until rownow% = rowend% + 1 rownow% = 3 colnow% = colnow% + 1 skijyun! = Cells(rowend% + 2, colnow%).Value Next p% '主成分層別終了 rowdown$ = "3:" & CStr(rowend%) 'ソート Rows(rowdown$).Select Selection.Sort Key1:=Range("B3"), Order1:=xlAscending, Header:=xlNo, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _ :=xlPinYin End Sub