配列のセットの仕方

このQ&Aのポイント
  • VBで英文の単語を抽出して頻度順に並べるプログラムを作成したい
  • VBのソースコードとQuickSortのソースコードを結合する方法がわからない
  • アドバイスをお願いします
回答を見る
  • ベストアンサー

配列のセットの仕方

度々質問してすいません。 英文の単語を抽出して頻度順に並べるプログラムをVBで作りたいと思っております。下記URLのVB版です。 (http://gamp.c.u-tokyo.ac.jp/archive/perl.htm) 以下が作成したソースです。これとQuickSortのソース(http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm) を繋げて終わりたいと思うのですが、 どうつなげたらいいのかわかりません。 アドバイスをお願いいたします。 Private Sub Command1_Click() Dim strTarget As String Dim strResult As String Dim cha As String Dim chaList() As String Dim word As String Dim wordList() As Long Dim i As Long, j As Long Dim EndFlg As String strTarget = Me.Text1.Text i = 0 EndFlg = "" Do Until EndFlg = "END" i = i + 1 cha = Mid(strTarget, i, 1) If cha <> "" Then ReDim Preserve chaList(i) chaList(i - 1) = cha Else EndFlg = "END" End If Loop For i = 0 To UBound(chaList) - 1 If chaList(i) = "." Then chaList(i) = " " End If Next Text2 = "" For i = 0 To UBound(chaList) - 1 Text2 = Text2 & chaList(i) Next Text3 = "" word = "" For i = 0 To UBound(chaList) - 1 If chaList(i) = " " Then If i = 0 Then Else If chaList(i - 1) = " " Then Else Text3 = Text3 & Chr(13) & Chr(10) & word word = "" End If End If Else word = word & chaList(i) End If Next If word <> "" Then Text3 = Text3 & Chr(13) & Chr(10) & word End If

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

サンプルを作ってみました。 '--------------------------------------------------------------- Dim strTarget As String Dim strResult As String Dim text As String Dim strArray, dic, keyArray, str, x Dim n, wk, i As Integer, j As Integer, k As Integer 'ソートで使う変数 strTarget = Me.Text1.Text text = Trim(strTarget) '前後のスペース削除 text = LCase(text) '小文字に統一 text = Replace(text, ",", "") '除外文字の削除 text = Replace(text, ".", "") text = Replace(text, "?", "") 'text = Replace(text, "the","") '除外文字列(ワード)の削除 strArray = Split(text, " ") 'スペースで分割して配列に格納 Set dic = CreateObject("Scripting.Dictionary") 'ディクショナリオブジェクトを使ってカウント For Each str In strArray If str <> "" Then '中身が無いときスキップ If dic.Exists(str) Then '既に登録されている時+1 dic.Item(str) = dic.Item(str) + 1 Else dic.Add str, 1 '新しく辞書登録 End If End If Next keyArray = dic.keys '登録したキーを配列で取り出す 'シェルソート n = UBound(keyArray) k = n \ 2 Do While (k > 0) For i = 0 To n - k j = i Do While (j >= 0) '個数が大きい時、または同じ個数の時、文字の辞書順で交換 If (dic.Item(keyArray(j)) < dic.Item(keyArray(j + k))) Or _ (dic.Item(keyArray(j)) = dic.Item(keyArray(j + k))) And (keyArray(j) > keyArray(j + k)) Then wk = keyArray(j) keyArray(j) = keyArray(j + k) keyArray(j + k) = wk j = j - k Else Exit Do End If Loop Next k = k \ 2 Loop '結果の出力 strResult = "" For i = 0 To dic.Count - 1 strResult = strResult & keyArray(i) & ":" & dic.Item(keyArray(i)) & vbCrLf Next Text4.text = strResult End Sub '--------------------------------------------------------------- ソート部分のソートの方法はなんでもいいです、 要は、比較対象を比較して、その時交換すべき物を交換することができればいいのです。 質問文の参考URLでは、種別ごとのソートになっていますが、バリアントを使うと種類を考えないでソートできます。 この場合、1つの種類でなく、キー(ワード)と、値(件数)の対応がとれている配列を渡すようにすればいいかもしれません。 そのまま、内部でソートしています。

dindin_001
質問者

お礼

ありがとうございます。 家に帰ったらさっそく読んでみます。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

もうひとつわからないのですが、 Text1には、 This is a pen. That is an apple. とかなんとか入ってるということですか? それで、is:2回とかしたいということですか? 同じ頻度のwordが有った場合、(ThisとThatが有った場合、Thatが前に来るとか)順序は考慮するのでしょうか? また、THIS とThisは別ですか、同じですか? Text2と、Text3は、何に使うのでしょうか? Text2は、.とか?とか,とか改行とかそういう物を取り除いたText1と考えて良いのでしょうか? 結局、出力はどこにどういう形式でするんでしょう?

dindin_001
質問者

お礼

返信ありがとうございます。 >This is a pen. That is an apple. とかなんとか入ってるということですか? それで、is:2回とかしたいということですか? そういうことです。最終的にはi等のbe動詞をカットする機能も付けたいと思っております。 >また、THIS とThisは別ですか、同じですか? 同じにしたいと思っております。 >Text2は、.とか?とか,とか改行とかそういう物を取り除いたText1と考えて良いのでしょうか? text2,text3は、途中経過を見るために作っております。最終的には無くしてしまおうと思ってます。 それで結構です。最終的な出力はテキストボックス(Text4)にする予定です。

関連するQ&A

  • TreeViewに重複する値をセット

    VB2005Expressで開発しています。 TreeViewにデータテーブルの値をセットして表示しています。 セットする値に重複する値がある場合、ツリーの構造が崩れてしまいます。左図のようにしたいのですが、右図のようになってしまいます。 あ あ |-い |-い | | | | | -う | -う お | -え |-い お | | | -え ツリーの値に非表示のキーを持たせる等、何か対応法をご存知の方が いらっしゃいましたら教えて下さい。下記がPGMです。 '処理内容:TreeViewにデータテーブルの値をセット Private Function fncTreeViewSet() As Boolean Dim dTbl As DataTable Dim Node As TreeNode Dim intMenuNo As Integer Dim strMenuName1 As String Dim strMenuName2 As String Dim strMenuName3 As String Dim strMenuName4 As String Dim strMenuName5 As String Dim i As Integer Node = TreeView1.SelectedNode dTbl = dsDataSet.Tables("Mメニュー") For i = 0 To dTbl.Rows.Count() - 1 intMenuNo = 0 strMenuName1 = "" strMenuName2 = "" strMenuName3 = "" strMenuName4 = "" strMenuName5 = "" strMenuName1 = Trim$(dTbl.Rows(i)("階層1")) intMenuNo = dTbl.Rows(i)("工程番号") strMenuName2 = Trim$(dTbl.Rows(i)("階層2").ToString) strMenuName3 = Trim$(dTbl.Rows(i)("階層3").ToString) strMenuName4 = Trim$(dTbl.Rows(i)("階層4").ToString) strMenuName5 = Trim$(dTbl.Rows(i)("階層5").ToString) If strMenuName1 = "" Then Else If strMenuName2 = "" Then TreeView1.Nodes.Add(strMenuName1) '階層1をセット Else If strMenuName3 = "" Then fncSerchNode(strMenuName1) TreeView1.SelectedNode.Nodes.Add(strMenuName2) '階層2をセット Else If strMenuName4 = "" Then fncSerchNode(strMenuName2) TreeView1.SelectedNode.Nodes.Add(strMenuName3) '階層3をセット Else If strMenuName5 = "" Then fncSerchNode(strMenuName3) TreeView1.SelectedNode.Nodes.Add(strMenuName4) '階層4をセット Else fncSerchNode(strMenuName4) TreeView1.SelectedNode.Nodes.Add(strMenuName5) End If End If End If End If End If Next TreeView1.SelectedNode = Nothing End Function '処理内容:指定ノード選択 Private Function fncSerchNode(ByVal strMenuName As String) As Boolean Dim Node As TreeNode For Each Node In fncGetAllNodes(TreeView1.Nodes) If Node.Text = strMenuName Then TreeView1.SelectedNode = Node Exit For End If Next End Function '処理内容:子ノードも含んだすべてのノードを取得 Private Function fncGetAllNodes(ByVal Nodes As TreeNodeCollection) As ArrayList Dim Ar As New ArrayList Dim Node As TreeNode For Each Node In Nodes Ar.Add(Node) If Node.GetNodeCount(False) > 0 Then Ar.AddRange(fncGetAllNodes(Node.Nodes)) End If Next Return Ar End Function

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub

  • vb 配列の再検索について

    こんばんは、 vbで悩んでいます。  配列の検索で、みつかったら、行と位置を出力する でた結果の次の行から 再検索する ということをしたいのですが。 一回目の検索はできるのですが、ボタンをおしたら つづいて 検索できるようにしたいのです。 できたら、アドバイス等おねがいいたいします。 Dim i,r,j As Integer Dim a1() As String Dim a2 As String a2 = Text.Text For j = LBound(a1) To UBound(a1) r = r + 1 i = a1(j).IndexOf(a2, 0) Do Until i <> 0 text1.Text = Val(i + 1)  i = a1(j).IndexOf(a2, i + 1) text2.Text = r  text3.Text = a1(j) If i <> 0 Then Exit For End If Loop Next a1に以下の内容があった時 a1(0) = "例1" a1(1) = "例2" a1(2) = "例3" ”例”と検索をかけると、 text1.Textには 1と出力。(位置表す) text2.Textには 1と出力。(行表す) text3.Textには 例1と出力。 exit for でループをぬけているのですが。 これを、検索ボタンを押すたびに、行と位置 が表示されるようにしたいのですが、 アドバイスおねがいします。

  • VB2005で、Structureの配列を返すプログラムを以下のように書きたい

    VB2005で、Structureの配列を返すプログラムを以下のように書きたいのですが、そもそもVB6しか使ったことが無いもので、以下のような素数の結果を返すこのプログラムの書き方はVB2005らしいでしょうか? Module Module1 Public Structure SosuuStatus Public num As Integer Public status As String End Structure Class Sosuu Function SosuuCheck(ByVal st As Integer, ByVal ed As Integer) As SosuuStatus() Dim i As Integer, j As Integer Dim sosuu(0 To ed - st) As SosuuStatus Dim cnt As Integer = 0 For i = st To ed sosuu(cnt).num = i sosuu(cnt).status = "" '初期化 If 1 = i Then sosuu(cnt).status = "素数ではない" ElseIf 0 = (i Mod 2) Then sosuu(cnt).status = "素数ではない" Else For j = 3 To Math.Sqrt(ed) If 0 = (i / j) Then sosuu(cnt).status = "素数ではない" End If Next j End If If sosuu(cnt).status = "" Then sosuu(cnt).status = "素数である" End If cnt = cnt + 1 Next i SosuuCheck = sosuu End Function End Class End Module

  • 構造体配列のソート

    VB6 ソートのやり方は知っていますが、構造体の定義が変わると対応できません。 ソート処理部分だけを共通関数にできますでしょうか? Private Type Sort strCol1 As String intCol2 As Integer sttCol3 As String End Type Private Sub A() Dim typSort(3) As Sort 'ここに、構造体データ設定処理を記述 Call subSort(typSort(), typSortCopy) End Sub Private Sub subSort(typTaget() As Sort) Dim lngOutLoop As Long Dim lngCurent As Long Dim lngInLoop As Long Dim Min As Variant Dim typSortCopy As Sort For lngOutLoop = LBound(typTaget) To UBound(typTaget) - 1 Min = typTaget(lngOutLoop).strCol1 lngCurent = lngOutLoop For lngInLoop = lngOutLoop + LBound(typTaget) + 1 To UBound(typTaget) If typTaget(lngInLoop).strCol1 < Min Then Min = typTaget(lngInLoop).strCol1 lngCurent = lngInLoop End If Next lngInLoop typTagetCopy = typTaget(lngOutLoop) typTaget(lngOutLoop) = typTaget(lngCurent) typTaget(lngCurent) = typTagetCopy Next lngOutLoop End Sub

  • 2010 excel マクロ 記号の変化

    エラー発生で強制終了になってしまいます。2007年のexcelで作成したものですが、2010だと強制終了になってしまいます。 内容は□をダブルクリックすると■になるように作っています。 記述は2003年からのマクロ記述なので、変化が必要なのでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'セルをダブルクリックすると、・→○→△→×→・と変更する。 Dim S1 As String Dim S2 As String Dim S01 As String Dim S02 As String Dim S03 As String Dim S04 As String S1 = "□" S2 = "■" S01 = "・" S02 = "○" S03 = "△" S04 = "×" On Error GoTo ERR_12 sCheckXY S1, S2 sCheckX1234 S01, S02, S03, S04 sChangeXY S1, S2 Exit Sub ERR_12: End End Sub Sub sChangeXY(X As String, Y As String) '選択セルに□があれば■に変える Dim Str0 As String 'str1の左端 Dim Str1 As String 'strの右側更新 Dim Str2 As String 'strの左側更新 Dim Str20 As String 'strの左側一部保存 Dim L As Long Dim M As Long Dim N As Long Str1 = ActiveCell.Text L = Len(Str1) Debug.Print L If L = 0 Then End End If For N = 1 To L Debug.Print Str2 Str0 = Left(Str1, 1) If Str0 = X Or N = L Then If Str20 <> "" Then If N = L Then Str20 = Str20 + Str0 End If If MsgBox(Str20 & "  はチェックしますか?", vbYesNo, "選択肢") = vbYes Then Str2 = Str2 + Replace(Str20, X, Y) Str20 = Str0 Else Str2 = Str2 + Replace(Str20, Y, X) Str20 = Str0 End If Else Str20 = Str0 End If Else Str20 = Str20 + Str0 End If Str1 = Right(Str1, L - N) Next N ActiveCell.Value = Str2 End Sub Sub sCheckXY(X As String, Y As String) '選択セルがXならY,YならXにチェックをかえる If ActiveCell.Text = X Then ActiveCell.Value = Y End ElseIf ActiveCell.Text = Y Then ActiveCell.Value = X End End If End Sub Sub sCheckX1234(X1 As String, X2 As String, X3 As String, X4 As String) '選択セルがXならY,YならXにチェックをかえる If ActiveCell.Text = X1 Then ActiveCell.Value = X2 End ElseIf ActiveCell.Text = X2 Then ActiveCell.Value = X3 End ElseIf ActiveCell.Text = X3 Then ActiveCell.Value = X4 End ElseIf ActiveCell.Text = X4 Then ActiveCell.Value = X1 End End If End Sub

  • 「'」もascで変換させたい

    A1に「'test」と入れると「test」になってしまいます。 そして、 Sub test() Dim MojiInt As Long Dim i As Long Dim myRow As Long Dim Moji As String MojiInt = Len(Cells(1, 1)) For i = 1 To MojiInt Moji = Mid((Cells(1, 1)), i, 1) If i = 1 Then Cells(1, 2) = Asc(Moji) Else Cells(1, 2) = Cells(1, 2) & "," & Asc(Moji) End If Next i End Sub をすると、 116,101,115,116 になります。 最初の「'」もascで変換させることは無理なのでしょうか?

  • JIS codeでの文字数・桁数制限

    Access97を使用しております。 VBのカテゴリに近いと思い質問させて下さい。 >JIS codeでの文字数・桁数制限を行いたいのですが、 条件がきつく困ってます。 条件.(JIS)20文字で改行 MAXが25桁まで入力可能 >>一応行数は改行数を数えることで、取得できてます。 Dim i As Integer Dim strChk As String Dim intCnt As Integer '2桁取得し改行を認識させる。 For i = 1 To Len(Me.内容) - 1 strChk = Mid$(Me.内容, i, 2) If strChk = Chr(13) & Chr(10) Then intCnt = intCnt + 1 End If Next i Me.txtGyo = intCnt + 1 Exit Sub 文字数は通常1行であれば↓のようなコードですみますが、両方って・・・・; >改行マーク「Chr(13)&Chr(10)」迄が1行と考えるって事なんでしょうが初 心者には難しいくご教授お願い致します。 Dim strMoji As String Dim strChck As String strMoji = Me.内容 strChck = LenB(StrConv(strMoji, vbFromUnicode)) Me.txtMsg = "" If strChck >= 33 Then Me.txtMsg = "文字数がOverしてます。" Else Exit Sub   End If

  • VB6で、指定バイト数を超えた場合はその直前に。

    VB6で、最高文字数を指定するとともに、そのバイト数を超えた場合、超える直前の状態を出力する文字列とする、という処理を考えています。 最大のバイト数を116とすると、全角なら58文字までですが、 57文字まで全角で入力し、次の一文字を半角にする。 そして最後に全角を1文字打つと、116バイトを超えてしまうので、 出力文字は半角のところまでとする。 という形です。 Public Function GetStrForLimitByte(cs As String, size As Long) Dim i As Long Dim p As Long Dim limitStr As String Dim temp As String Dim parts() As String limitStr = "" ' 文字列のバイト数が指定バイト数以下は文字列をそのまま返す If (LenB(cs) <= size) Then cs = cs Else p = Len(cs) For i = 1 To p parts(i) = Mid(cs, i, 1) '1文字ずつ連結 temp = limitStr + parts(i) If (LenB(temp) > size) Then limitStr = limitStr Else limitStr = limitStr + parts(i) End If Next End If End Function すると、parts(i) = Mid(cs, i, 1)のところで「インデックスが有効範囲でありません。」 というメッセが出てしまいます。 なぜでしょうか? ご回答お待ちします、お願いします。

  • 素数の計算について教えてください

    「2以上の整数を入力すると、入力した数まで素数をすべて表示する。」 どこが間違っているか教えてください!! 5行目あたりからだと思うのですが・・・。 お願いします!! Dim Number As Long If Long.TryParse(TextBox1.Text, Number) AndAlso Number >= 2 Then For i As Integer = 2 To Number Step 1 Dim d As Long = 2 Do Until Number Mod d = 0 d = d + 1 Loop If d = Number Then Label1.Text = " " & i Else Label1.Text = "2以上の整数を入力してください" End If Next End If End Sub

専門家に質問してみよう