dポイントプレゼントキャンペーン実施中!

 |A|B|C|D|
--------------
1|あ|い|う|え|
--------------
2|お|あ|あ|か|
--------------

上記は1行目に左から「あ」「い」「う」「え」が入力されていることを表しています。

この表の中から、一番多く入力されている文字だけを別のセルに抽出させるにはどのようにしたら良いでしょうか。
上記の例を使用すると、A列の5行目(任意のセル)に「あ」と抽出するようにしたいです。

いろいろと調べてみましたが、このように表の中で最も多く入力されている、「文字」または「数字」だけを抽出するという処理方法がみつかりませんでした。
マクロなら可能でしょうか?


このような処理ができる関数もなさそうなので、無理なのかな。

アドバイスを御願い致します。

A 回答 (13件中11~13件)

簡単なマクロを作ってみました。



Option Explicit

Sub maxmoji()
Dim gyou As Integer
Dim retsu As Integer
Dim countmoji(100, 4)
Dim mojishu As Integer
Dim cellchar As String
Dim seirinum As Integer

Dim i As Integer
Dim j As Integer

Const moji = 0
Const kazu = 1
Const leftbig = 2
Const rightbig = 3

Dim maxchar As String
Dim maxnum As Integer
Dim thiscount As Integer

gyou = Range("A1").End(xlDown).Row
retsu = Range("A1").End(xlToRight).Column

mojishu = 0

For i = 1 To gyou
For j = 1 To retsu
cellchar = Cells(i, j).Value
seirinum = 0
If mojishu = 0 Then
countmoji(0, moji) = cellchar
countmoji(0, kazu) = 1
mojishu = 1
Else
Do
If countmoji(seirinum, moji) = cellchar Then
countmoji(seirinum, kazu) = countmoji(seirinum, kazu) + 1
Exit Do
ElseIf countmoji(seirinum, moji) > cellchar Then
If countmoji(seirinum, leftbig) > 0 Then
seirinum = countmoji(seirinum, leftbig)
Else
countmoji(seirinum, leftbig) = mojishu
countmoji(mojishu, moji) = cellchar
countmoji(mojishu, kazu) = 1
mojishu = mojishu + 1
Exit Do
End If
Else
If countmoji(seirinum, rightbig) > 0 Then
seirinum = countmoji(seirinum, rightbig)
Else
countmoji(seirinum, rightbig) = mojishu
countmoji(mojishu, moji) = cellchar
countmoji(mojishu, kazu) = 1
mojishu = mojishu + 1
Exit Do
End If
End If
Loop
End If
Next
Next

maxnum = 0
For i = 0 To mojishu
thiscount = countmoji(i, kazu)
If thiscount > maxnum Then
maxnum = thiscount
maxchar = countmoji(i, moji)
ElseIf thiscount = maxnum Then
maxchar = maxchar & " , " & countmoji(i, moji)
End If
Next

Cells(5, 1).Value = maxchar

End Sub
    • good
    • 0

こんにちは。

maruru01です。

行、列とも複数だと難しいようです。
データが1行か1列になっていれば、関数で出来ます。
例えば、A1~H1にデータがある場合、

=INDEX($A$1:$H$1,MIN(IF(COUNTIF($A$1:$H$1,$A$1:$H$1)=MAX(COUNTIF($A$1:$H$1,$A$1:$H$1)),COLUMN($A$1:$H$1),65537)))

と入力して、[Ctrl]+[Shift]+[Enter]で配列数式にします。
(数式の両端に「{}」が付きます)
これで例だと、「あ」が表示されます。
ちなみにデータを1行にする場合は、数式のCOLUMN関数をROW関数に替えて下さい。
    • good
    • 0
この回答へのお礼

こんばんは。
maruruさん、御回答ありがとうございます。

行と列の中から抽出するのは、難しいのですね。。。
現在使用しているデータが、複数の行と列にまたがって入力されちるため、表の全体から抽出することができればいいな、と思っていました。

まだ実際には試していないのですが、一番多く入力されていた文字が2つ以上あるとしたら、全ての文字を抽出させることは無理ですよね??
抽出文字にも優先順位がありそうですし。

VBAを使用しても難しいでしょうか。

もうちょっと模索してみます。

また何かアドバイスがありましたら、よろしく御願いします。

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

お礼日時:2003/05/12 23:12

エクセルの関数の1つに、FREQUENCYと言うのがあります。


各セルに必ず1文字、1数字が入っているなら、と言うよりセル単位で語(a,abcなど)か数字(1,13など)単位で
出現頻度を出すようです。
http://bosei.cc.u-tokai.ac.jp/~yhiroshi/cmpltr/t …
他「エクセル FREQUENCY」でWEB照会してください。相当多数出ます。配列数式{・・・}と言う概念が出ますので、その理解が必要かと思います。
ただし、ちょっと質問の趣旨とずれているかもしれませんね。
VBAなら出来そうです。朝で時間がなくこの辺で。

この回答への補足

そう言えば、使用ソフトを記載していませんでした。
使用ソフトはエクセルです。

補足日時:2003/05/12 09:11
    • good
    • 0
この回答へのお礼

早速の御回答ありがとうございます。
「FREQUENCY」関数ですが、これは分布を調べる関数なので私が希望するような処理はできないようです。
せっかうアドバイスして頂けたのに、すみません。

やはり関数のみで処理するのはできないでしょうか。
VBで処理できるとしても、私には記述できないので、もしVBでできそうであればどなたかアドバイスを御願い致します。

imogasiさん、ありがとうございました。

引き続き、何かありましたらアドバイスを御願いします。

お礼日時:2003/05/12 08:26

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