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