
No.5ベストアンサー
- 回答日時:
Sub Main()
Dim num() As String = {"4", "2", "3", "5", "2", "9", "7", "5", "8", "5"}
Dim groupValues = num _
.GroupBy(Function(value) value) _
.Select(Function(groupValue) New With {.Num = groupValue.Key, .Count = groupValue.Count()}) _
.Where(Function(groupValue) groupValue.Count > 1)
For Each groupValue In groupValues
Console.WriteLine($"[ ""{groupValue.Num}"" が {groupValue.Count}個 ]")
Next
Console.ReadLine()
End Sub
全部把握したいなら、ラムダ式のWhere行を取り除いてください。

回答して頂きありがとうございます。
SQLのSELECT句で幾度もグループ化をしていながら、今回思いつかなかった(どこに入れたら良いのか不明でもあった)点につきまして、大変参考になりました。
しかも .Key や .Count の使い方につきましては ToDictionary でやったはずなのに今回それを使える事自体勉強不足でした。
(その分遠回りしてました)
貴重な参考コード大事に保管させて頂きます。
No.6
- 回答日時:
う〜ん、多分一番シンプルなのは#2で書いたような方式になるのかなぁ。
## LibreOffice BASICでの例
REM ***** BASIC *****
Sub Main
Dim num As Variant
num = Array("4", "2", "3", "5", "2", "9", "7", "5", "8", "5")
Dim answers(10) As Integer
For counter = LBound(num) to UBound(num)
answers(val(num(counter))) = answers(val(num(counter))) + 1
Next
For counter = LBound(answers) to UBound(answers)
if answers(counter) > 1 Then
Print "[",counter,"が",answers(counter),"個]"
End if
Next
End Sub
## ここまで
と言うのも、ラムダ式を使う、ってのは一見良さそうな手に思えるんだけど、この問題の性質としては基本的に「破壊的変更」が避けられないのね。
アキュムレータ、つまり、解を保存する「場所」を書き換えないとならないから。
ラムダ式を使って、例えばmapとかfilterなんかの高階関数を使う前提は、走査する配列なり、解を保存する「変数」とかは「不変にしないとならない」って条件があって、この質問の場合、設定されたnumは変更不可として考えていいけど、解を保存する側は絶対「データを書き換えない」とならないんじゃないかなぁ・・・・・・。
つまり、関数型プログラミング的な処理が「出来ない」って前提になると思う。
そこを無理してやると、結果、シンプルさと縁がない解になっちゃうんじゃないかしらん。
度々の回答をありがとうございます。
確かにシンプル性としては仰るのもごもっとも。
詳しく書いて頂けた内容は今回のテキストファイルに追加し保存させて頂きます。
今回につきましてはVBAでは出来ない方法としてどんなのがある物なのかを知ってみたく、敢えてVBとして質問しました。
どう使い分けるかはその時の状況等で決めたいと思います。
No.4
- 回答日時:
再度の回答ありがとうございます。
そうなのですよね。
回答して頂いた参考サイト等は方法として見つかるのですが、『重複しない文字』と『その文字が出てくる個数』について、どのように切り分け?結合?別管理?すべきかで模索中です。
No.3
- 回答日時:
VBは全然知らんのだけど、単純に配列使えば済むんじゃないのかしらん。
例えばVBAに近いLibreOffice Basicだと
REM ***** BASIC *****
Sub Main
Dim num As Variant
num = Array("4", "2", "3", "5", "2", "9", "7", "5", "8", "5")
Dim answers(10) As Integer
For counter = LBound(num) to UBound(num)
answers(val(num(counter))) = answers(val(num(counter))) + 1
Next
End Sub
多分こんなカンジになる。
回答して頂きありがとうございます。
今の現状は補足追加しました。
配列化は確かに必要になると思うのですが、いかにスリムに行けるか?で止まっています。
No.2
- 回答日時:
No.1の者です。
VBでしたね。 失礼しました。
VBは詳しくないので、検索しただけですが、
配列内で並べ替え。
配列の1つ目を取得、別の配列へ入れる。
配列から、1つ目を取り出し、配列に入れる。別の配列に個数1を入れる。
配列から、2つ目を取り出し、先ほどの文字と比較。 同じなら、
別の配列に1を足す。
違うなら、配列の上限を1増やす。 2つ目の文字を入れる。
別の配列の上限を1増やす。 配列に個数1を入れる。
これを、繰り返して配列内の文字を全て処理する。
先ずは、配列内を並べ替えでしょうか?
https://dobon.net/vb/dotnet/string/stringcompare …
https://smdn.jp/programming/dotnet-samplecodes/s …
配列
https://kcfran.com/2021/03/28/net-array-1/#toc7
https://turtle-engineers.com/vb-foreach/
再度の回答して頂きありがとうございます。
今の現状は補足追加しました。
配列化は確かに必要になると思うのですが、いかにスリムに行けるか?で止まっています。
No.1
- 回答日時:
こんばんは。
個人的な意見になりますが、
VBAですと、Dictionaryクラスを使うのが、普通かと思います。
シート上なら、重複の削除や、新しいExcelなら、UNIQUE関数などが
ありますね。 それでリストを作って、その後にそれぞれ幾つあるか?を
カウントするでしょうか?
あとは、自分で1からコードを作るか?でしょうか?
大した解答ではありませんが。
早々に回答して頂きありがとうございます。
ただ、
・Excel(VBScript)にはDictionaryクラスは存在しない。(Dictionaryオブジェクトである)
・以前も勘違いされたので冒頭にて
【VisualStudioのVBです。】
と記載をしている事ですかね。
このカテはVBA専用ではなく元々VisualBasicにVBAも含めていると思ってますが、標記に問題ありなのかなって感じます。
他のサイトでも同一カテになっている所はありますが、回答者側で判断し回答分けしているようです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) VBA 改行コードの取り方 1 2022/03/22 14:14
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
このQ&Aを見た人はこんなQ&Aも見ています
-
VB.net 重複チェックがしたいです
Visual Basic(VBA)
-
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
-
4
VB.netの重複データ数カウントについて
Visual Basic(VBA)
-
5
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
6
VB.NETで小数点以下の桁数を取得したい
その他(ソフトウェア)
-
7
【VB】タブ切り替え時のイベント
Visual Basic(VBA)
-
8
CloseとDisposeの違い
Visual Basic(VBA)
-
9
VB.NETでコンボボックスの1行目を空白にしたい
Visual Basic(VBA)
-
10
VB.NET2005 TextBox 高さ(Height) 変更
Visual Basic(VBA)
-
11
フォームの再読み込み
Visual Basic(VBA)
-
12
VB2008で定数に色の設定をしたいです。(初心者)
Visual Basic(VBA)
-
13
配列の中に重複文字列があるか否かをチェックしたいのですが、アルゴリズムを教えてください。
その他(プログラミング・Web制作)
-
14
VBのReturnの使い方
Visual Basic(VBA)
-
15
VB.net 引数で配列変数を渡す際の要素数
Visual Basic(VBA)
-
16
VB.NETでフォーム上にExcelのような表を表示する方法
Visual Basic(VBA)
-
17
VBからEXCELのセルの値を取得する方法
Visual Basic(VBA)
-
18
VB.NET 2次元配列
Visual Basic(VBA)
-
19
重複した文字列をカウントして取り出したい
Visual Basic(VBA)
-
20
Ctrl + Cなど複数の入力キーの感知
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「隣の芝生は青く見える」現象...
-
同じクラスにならない確率を教...
-
dllと同じプロジェクトにする方法
-
java eclipse 型に解決できません
-
重複エラーを解決するには
-
main()を持つクラスが2つ以上...
-
小学4年の頃、好きな同級生にス...
-
フレームとウィンドウの違いに...
-
IPアドレスのクラスAを取得して...
-
そんなにお金がなくても年に1度...
-
どこからも呼ばれていない無意...
-
Java「デフォルトのパッケージ...
-
EclipseでJSPのコンパイルエラー
-
下記の問合せを行うクエリを、P...
-
UMLのクラス図はmain()も含むん...
-
「エンクロージング型」と「外...
-
共通で使う関数を集めたクラス...
-
恋愛
-
Cstring(日本語含む)をcharに...
-
Imports 文についての疑問!(VB...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じクラスにならない確率を教...
-
配列の重複する値とその個数を...
-
java eclipse 型に解決できません
-
3年間同じクラスになる確率
-
どこからも呼ばれていない無意...
-
共通で使う関数を集めたクラス...
-
ページ遷移時にアコーディオン...
-
同じパッケージ、クラス名が含...
-
IPアドレスの3バイト目の呼び方
-
同一パッケージにあるクラスが...
-
EclipseでJSPのコンパイルエラー
-
コンボボックスのマウスホイー...
-
Cstring(日本語含む)をcharに...
-
dllと同じプロジェクトにする方法
-
VBAもしくはVB6:クラスの中で...
-
main()を持つクラスが2つ以上...
-
複数のクラスで共通した関数を...
-
重複エラーを解決するには
-
string formatについて
-
UMLのクラス図はmain()も含むん...
おすすめ情報
質問は文字列型で宣言し代入してますが、実数型に置き換えて頂いても構いません。
あくまでも手段を知りたいだけですので。
回答して頂きありがとうございます。
今の所重複削除まではいけているのですが、その先がスリムにとはいかず・・・
Dim num() As String = {"4", "2", "3", "5", "2", "9", "7", "5", "8", "5"}
Dim num2 = num.Distinct()
Console.WriteLine(String.Join("_", num2)) ' 4_2_3_5_9_7_8
num2の値を基にnumのカウントが出来ればとは思っていますが、Pythonのラムダ式みたいな感じのものが出来ないかなとは思っております。
Dim num() As String = {"4", "2", "3", "5", "2", "9", "7", "5", "8", "5"}
Dim num2 = num.Distinct().OrderBy(Function(s) s)
Dim num3 = num2.ToList().Select(Function(x) New With {.nam = x,
.con = (num.Where(Function(y) y = x).Count())}).Where(Function(z) z.con > 1).ToArray()
For i As Integer = 0 To num3.Length - 1
Console.WriteLine($"[ ""{num3(i).nam}"" が {num3(i).con}個 ]")
Next
結果:
[ "2" が 2個 ]
[ "5" が 3個 ]
まだ未熟ですよねぇ。