質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

3016閲覧

VBAでtxtを検索

yuurin

総合スコア13

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2019/02/22 08:40

編集2019/03/04 02:46

質問失礼いたします
プログラミングの経験がなく、VBA自体を初めて触るものです
VBAを使って口座情報のtxtファイルを管理するプログラムの改修作業ですが、excelワークシートに入力する場所を30枠用意し、間に空白のセルがあってもちゃんと検索し、出力できるようにしたいです

わからないなりに書き換えてみましたが、Public Sub executeSeachAndOutput(ByVal inputDataList As Variant)
の部分で処理が止まってしまいます
どのようにすればいいか、どこを改修すればいいのかヒントでもいいので教えていただきたいです

また、こうした処理をする場合、テキストボックスを使用するのとセルに入力してもらうのとどちらの形の方が作りやすいですか?

VBA

1'標準モジュール 2 3'ファイル取得処理 4Public Sub GET_TextFile() 5 Dim objFS As Object 6 Dim strPath As String 7 Dim strFile As String 8 Dim strFolder As String 9 Dim ofdFolderDlg As Office.FileDialog 10 11 strPath = Range("selectFileName").Value 12 Set objFS = CreateObject("Scripting.FileSystemObject") 13 14 ' 初期パスの設定 15 If Len(strPath) > 0 Then 16 ' 末尾の"\"削除 17 If Right(strPath, 1) = "\" Then 18 strPath = Left(strPath, Len(strPath) - 1) 19 End If 20 21 ' ファイルが存在 22 If objFS.FileExists(strPath) Then 23 ' ファイル名のみ取得 24 strFile = objFS.GetFileName(strPath) 25 ' フォルダパスのみ取得 26 strFolder = objFS.GetParentFolderName(strPath) 27 ' ファイルが存在しない 28 Else 29 ' フォルダが存在 30 If objFS.FolderExists(strPath) Then 31 strFile = "" 32 strFolder = strPath 33 ' フォルダが存在しない 34 Else 35 ' ファイル名のみ取得 36 strFile = objFS.GetFileName(strPath) 37 ' 親フォルダを取得 38 strFolder = objFS.GetParentFolderName(strPath) 39 ' 親フォルダが存在しない 40 If Not objFS.FolderExists(strFolder) Then 41 strFolder = ThisWorkbook.Path 42 End If 43 End If 44 End If 45 Set objFS = Nothing 46 Else 47 strFolder = ThisWorkbook.Path 48 strFile = "" 49 End If 50 51 ' ファイル選択ダイアログ設定 52 Set ofdFileDlg = Application.FileDialog(msoFileDialogFilePicker) 53 With ofdFileDlg 54 .ButtonName = "選択" 55 '「ファイルの種類」をクリア 56 .Filters.Clear 57 '「ファイルの種類」を登録 58 .Filters.Add "テキストファイル", "*.txt", 1 59 .Filters.Add "全ファイル", "*.*", 2 60 61 ' 初期フォルダ 62 .InitialFileName = strFolder & "\" & strFile 63 ' 複数選択不可 64 .AllowMultiSelect = False 65 '表示するアイコンの大きさを指定 66 .InitialView = msoFileDialogViewDetails 67 End With 68 69 70 71 ' フォルダ選択ダイアログ表示 72 If ofdFileDlg.Show() = -1 Then 73 ' フォルダパス設定 74 strPath = ofdFileDlg.SelectedItems(1) 75 Else 76 ' キャンセルされた場合以降の処理は行なわない 77 Exit Sub 78 End If 79 80 Range("selectFileName").Value = strPath 81 Dim all As New Collection 82 Set all = New Collection 83 Set all = READ_TextFile(strPath) 84 85 '検索出力実行 86 Dim main As New suzukiMain 87 Call main.executeSeachAndOutput(all) 88 Set ofdFileDlg = Nothing 89 90 MsgBox "CSVファイルを" & Chr(13) & strPath & Chr(13) & "に出力完了しました。" 91 92End Sub 93' ファイルの読み込み処理 94'配列に格納する処理 95Private Function READ_TextFile(ByVal strPathName As String) As Collection 96 Dim intNo As Integer 97 Dim objFS As Object 98 Dim strBuff As String 99 strPath = strPathName 100 101 Set objFS = CreateObject("Scripting.FileSystemObject") 102 103 If objFS.FileExists(strPath) = False Then 104 Exit Function 105 End If 106 107 ' ファイルオープン 108 intNo = FreeFile() ' フリーファイルNoを取得 109 Open strPathName For Input As #intNo ' ファイルをオープン 110 111 ' ファイルの読み込み 112 Dim arrayList As New Collection 113 Set arrayList = New Collection 114 Dim readList As New Collection 115 Set readList = New Collection 116 117 Do Until EOF(intNo) ' ファイルの最後までループ 118 119 Line Input #intNo, strBuff ' ファイルから一行読み込み 120 121 122 If Left(strBuff, 1) <> 2 Then '区分コードが2以外の場合次の行へ 123 GoTo nextLine 124 End If 125 126 readList.Add Trim(Mid(strBuff, 51, 30)) '氏名 127 readList.Add Trim(Mid(strBuff, 6, 15)) '銀行名 128 readList.Add Trim(Mid(strBuff, 24, 19)) '支店名 129 readList.Add Trim(Mid(strBuff, 2, 4)) '銀行コード 130 readList.Add Trim(Mid(strBuff, 21, 3)) '支店コード 131 readList.Add Trim(Mid(strBuff, 43, 8)) '口座番号 132 readList.Add Trim(Mid(strBuff, 43, 1)) '口座種類 133 arrayList.Add readList '読み込んだ値をリストに格納 134 Set readList = New Collection 'リスト初期化 135 136nextLine: 137 138 Loop 139 140 ' ファイルクローズ 141 Close #intNo 142 143 '戻り値設定 144 Set READ_TextFile = arrayList 145 146End Function 147 148 149 150 151 152 153'ここからクラスモジュール 154 155 156 157 158'クラスモジュールcommon 159Public Function getMaxRow(ByVal sheetName As String, ByVal cal As Long) As Long 160'最大行取得 161Dim maxRow As Long 162 163'下から 164maxRow = ThisWorkbook.Sheets(sheetName).Cells(Rows.count, cal).End(xlUp).row 165 166'結果を返却 167getMaxRow = maxRow 168 169End Function 170 171Public Function getDataList(ByVal sheetName As String, ByVal startRow As Long, ByVal cal As Long) As Collection 172'データリスト取得 173Dim resultList As Collection 174Set resultList = New Collection 175 176'最大行取得 177Dim maxRow As Long 178maxRow = getMaxRow(sheetName, cal) 179 180'最大行まで取得 181Dim takeData As String 182Dim count As Long 183For count = startRow To maxRow 184 takeData = ThisWorkbook.Sheets(sheetName).Cells(count, cal).Value 185 resultList.Add takeData 186Next count 187 188'結果を返却 189Set getDataList = resultList 190 191End Function 192 193 194 195 196 197 198 199'クラスモジュールsearchName 200 201Public Function executeSeach(ByVal inputDataList As Variant, ByVal nameList As Variant) As Variant 202 203Dim hitDataList(29) As Variant 204 205Dim inputItemList(29) As Variant 206 207Dim inputNameData(29) As Variant 208Dim nameItem(29) As Variant 209Dim nameData(29) As Variant 210 211 212For Each inputItemList In Range("B12:B41") 213 nameData = inputItemList.Item 214 215 216For Each nameItem In nameList 217 If InStr(nameData, nameItem) <> 0 Then 218 hitDataList.Add inputItemList 219 End If 220 Next nameItem 221 222End Function 223

以上について回答宜しくお願いします
< 使用 Excel:Excel2013、使用 OS:Windows7 >

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aki.aki.

2019/02/22 08:51

失礼ながら、質問と言うよりは、改修依頼になっていますね。 (でも、私は時間さえあれば、クイズ感覚で答えるのは好きなのですが。) やはり、ここは周囲に聞くなり、ご自分で調べることから始めた方がいいかと思います。辛口、失礼。
ttyp03

2019/02/22 09:17

やりたいことが2つあって、それぞれで何がわからなくてつまづいているのか書きましょう。 あと、 >これがその処理をしていると思われるクラスモジュールです 「処理をしていると思われる」程度の情報をあげられても困ります。 違うところだったらまったくの時間の無駄です。 それくらいは確定した情報の提供をお願いします。
guest

回答3

0

提示のコードは、クラスモジュールではない、ただの関数、その関数の内容を理解しているのか、できているのか、ちょっと疑問。
関数としては、データをCollectionに格納して比較しているが、今回の要件ではCollectionでは使いづらいので、これは無視して一から作成したほうがいいでしょう。

方針として下記ようになるでしょう。

(1)txtファイルを読み込む
1行ずつ読み込むか、一気に読み込んでSplitで行枚の配列にするか、のどちらかになります。
「vba txtファイル 読み込み」等をキーワードにWEB検索すればサンプルコードはたくさん見つかるでしょう。
(2)入力枠とは、ユーザーフォームにテキストボックスを配置することを想定していますか。それとも、シートのセルに入力させますか。その辺の仕様も明確に決めましょう。

他にも、ご提示のことをするには、いろいろな処理が必要ですが、とりあえず、txtファイルを読み込んで、配列にする、ことから始めてはどうでしょうか。

そこで、分からないことが出たり、行き詰ったら、その時点で、ワンポイントで質問しましょう。

投稿2019/02/22 10:34

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuurin

2019/02/25 00:25

対応ありがとうございます 入力枠の仕組みとしては、シートのセルに直接入力する仕組みになっています
hatena19

2019/02/25 02:16 編集

質問文は編集できるので、コードは質問文の方に追加してください。 あと、コードを提示して「はい、改修してください」ではなく、 どの部分が想定通りにいかないのか、ピンポイントで質問してください。
hatena19

2019/02/25 07:14

提示のコードは不足しているので、動作しません。コードを提示して「改修してください」ではなく、問題点を切り分けて一つずつご自身で解決するように努力してください。提示のコードでおそらくcsvの読み込みはできているようですので、それと入力枠のデータとの比較するコードをまずはご自身で書いてください。それでうまくいかない部分を質問してください。
guest

0

ベストアンサー

なが~いコードが書いてあるけど、
VB流のコードかな?
折角、エクセル君を使うのだから、エクセル君が出来ることは、エクセル君に任せた方が、
処理速度が速いし、開発も楽です。
(速度的に言ったら処理によっては別の方法でやるともっと速くなる可能性あり)

まずは、エクセル君を使えるようになった方がいいと思います。
エクセル君が使えると、「マクロの記録」という機能で、
操作がVBA語でいうと、どういう命令になるのか操作を翻訳してくれるので、
コードを調べることができます。

テキストファイルをエクセルに取り込むなら、
「テキストファイルのインポート」という機能(VBAでいうと、QueryTables.Add)が使えますし、
検索は、セルに入力するMatch関数(WorksheetFunction.Match)や、検索機能、
あるいはオートフィルターやフィルターオプションなどの機能が使えます。

そうすることで、開発の速度を上げることが可能かと思います。
(現状をブラッシュアップするにしても、一からExcel VBAを勉強するにしても、いずれも、
長く険しい道だとは思います。)

提示のコードは以下のように簡略化できそうです。
(流し読みしかしてないので、そちらがやりたいことを、
こちらが勘違いしている可能性も大きいのですが^^;)

VBA

1Sub テキストファイルをエクセルで見る() 2 Dim vFName As Variant 3 Dim rngTopLeft As Range 4 Dim wshView As Worksheet 5 6 Set wshView = ThisWorkbook.Worksheets("Sheet1") 7 Set rngTopLeft = wshView.Range("A4") 8 vFName = Application.GetOpenFilename("口座データ,*.txt") 9 If vFName = False Then Exit Sub 10 11 With wshView.QueryTables.Add(Connection:=vFName, _ 12 Destination:=rngTopLeft) 13 .RefreshStyle = xlInsertDeleteCells 14 .TextFileParseType = xlDelimited 15 .TextFileTextQualifier = xlTextQualifierDoubleQuoteter = False 16 .TextFileSpaceDelimiter = True 17 End With 18End Sub 19 20Sub 名前の検索() 21 Dim rngList As Range 22 Dim sKey As String 23 24 With ThisWorkbook.Worksheets("Sheet1") 25 Set rngList = .Range("A4").CurrentRegion 26 rngKeyWord = .Range("E5").Value 27 End With 28 29 On Error GoTo ErrHandler 30 rngList.Rows(WorksheetFunction.Match(sKey, .Columns(1), 0)).Select 31 On Error GoTo 0 32 Exit Sub 33 34ErrHandler: 35 MsgBox "名前がありません。" 36End Sub

また、こうした処理をする場合、テキストボックスを使用するのとセルに入力してもらうのとどちらの形の方が作りやすいですか?

セルにデータを入れると、
エクセル君が持っている既存の機能を存分に利用できますが、
テキストボックスだと、全ての機能を、現状のように全部自作する必要が出てきます。

あと、エクセル君は複数行を一度に編集することができるので
(良いところでもあり悪いところでもありますが)、
その辺を考慮してアプリケーションの開発をされるといいと思います。

投稿2019/03/08 13:02

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

誰かが書いたプログラムの修正ですか
そうだったら書き直すのは大変なので修正...っというのはいいのですが

main.executeSeachAndOutput(all) で処理が止まってしまうのですよね?
それは標準の関数ではないですよね?

それはどこで定義されていますか?
引数も Variant型なので
コードが無ければ どんな データを渡せば正常に動くのかも全く分かりません。

これでは 作った人にしか分かりません。
このままではいつまでたっても回答は付きませんよ?

投稿2019/03/08 09:00

kamikazelight

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問