塵芥回顧録

掃き溜めのようなブログ(?)

頻度分析マクロ

頻度分析できるマクロを作ってみた。


使い方
B1に頻度分析する文章を入力し、C4:AC131の範囲は何も記入しないでください。
C4:AC131にB1の文章を頻度分析した結果が入力されます。

文章記入位置と頻度分析結果表示位置の変更方法
 org_r,org_cの数値と"C4:AC131"を変更すると頻度分析結果の表示位置が変わり、
2箇所ある"B1"を2箇所とも変更すると頻度分析する文章を入力する位置が変わります。

表示分析結果の位置を変更する場合
 org_rとorg_cは頻度分析結果の表の一番左上を示していて、
デフォルトだとorg_rが4、org_cがCを示しています。
 Rangeはorg_cの列を含む英語の文字種類26+1の27列分と、
org_rの行を含む現在周期の最大値として設定している値127+1の128行分を選択するよう変更してください。
 周期の最大値は表を削除するときに使用するRangeの行の範囲と、
InputBox後のExit Subとなる条件を変更する事でIntegerの最大値まで増やすことができます。

Sub FREQUENCY_ANALYZE
	Dim oSheet as Object 'Cellの操作に必要
	oSheet = ThisComponent.CurrentController.ActiveSheet

	Dim org_r, org_c, v_cycle, i, j, FREQUENCY_COUNT, JUDGE As Integer
	FREQUENCY_COUNT = 1
	org_r = 3: org_c = 2 '表原点位置(左上)
	
	v_cycle = CInt(InputBox("周期入力 1 <= n <= " & 127,"InputBox",4)) '入力処理とキャスト
	If v_cycle < 1 Then Exit Sub '0以下の場合マクロを停止
	If v_cycle > 127 Then Exit Sub '128以上の場合マクロを停止
	
	oSheet.getCellRangeByName("C4:AC131").clearContents(511) '表のリセット
	
	Dim v_frequency(1 To v_cycle, 0 To 25) As Integer
	For i = 1 To v_cycle
		oSheet.getCellByPosition(org_c, org_r + i).value = i
	Next i
	For i = 0 To 25
		oSheet.getCellByPosition(org_c + i + 1, org_r).string = Chr(65 + i) '65=A
	Next i

	For i = 1 To LEN(osheet.getCellRangeByName("B1").string)
		JUDGE = Asc(UCase(MID(osheet.getCellRangeByName("B1").string,i,1)))
		If 64 < JUDGE And JUDGE < 91 Then '大文字
			JUDGE = JUDGE - 65 'A=65
			v_frequency(FREQUENCY_COUNT, JUDGE) = v_frequency(FREQUENCY_COUNT, JUDGE) + 1
			FREQUENCY_COUNT = FREQUENCY_COUNT Mod v_cycle + 1
		End If
	Next i
	
	For i = 1 To v_cycle
		For j = 0 To 25
			oSheet.getCellByPosition(org_c + j + 1, org_r + i).value = v_frequency(i, j)
		Next j
	Next i
End Sub

参考記事(LibreOfficeでのセルの操作方法)
LibreOfficeマクロ:セルの操作いろいろ試す(Range,Cells)
【LibreOfficeマクロ】セルの値クリアと全クリア | 新人・若手SEスキルアップNavi