アプリ版:「スタンプのみでお礼する」機能のリリースについて

あるスプレットシートが既にあり,そこにTextファイルから下記のようなデータをコピーしたいのですがよくできません。データが同じように並んでいて、Aの90という数値を検索したいと思っています。取得するデータはData2にあるAからDのデータを丸ごとコピー&ペイストしたいのです。ペイストするときには、スペースとコンマで区切りを付けてペーストしたいと思っております。

Data1
A 90, B -23.3, C 0.5, D 9
A 90, B -42.5, C 0.4, D 9
A 45, B -21.6, C 0.25, D 9
A 90, B 23.5, C 0.7, D 9
Data2
A 90, B -23.3, C 0.5, D 9
A 90, B -42.5, C 0.4, D 9
A 45, B -21.6, C 0.25, D 9
A 90, B 23.5, C 0.7, D 9

ネットに載っているのをいろいろ試しましたが、すべてのセルに検索がかかり使えませんでした(アレンジできませんでした)。
どうぞよろしくお願いいたします。

質問者からの補足コメント

  • どう思う?

    siffon9さんありがとうございます。説明不足で済みません。検索はA 90ではなく任意の数字でした。InputBoxに数字(ここでは90ですが、好きな数字)のみ入れて数値を検索したいのです。下記を入れましたがうまくいきませんでした
    s = InputBox("Input number(s)")
    CurDir ("C:\")
    textFile = Application.GetOpenFilename("Log File (*.log),*.log", 1, "Select LOG File")
    If (textFile <> "False") Then
    If (Trim(Dir(textFile)) = "") Then
    Call MsgBox("Missing Log file", vbOKOnly, "OK")
    Else
    strFind = "*" & s & "*" ' 検索文字列

      補足日時:2016/03/08 00:44
  • どう思う?

    結果こうなってくれればありがたいのですが、うまくいきません。どうぞよろしくお願いいたします。

    「[ExcelVBA] For Input」の補足画像2
      補足日時:2016/03/08 00:48
  • うーん・・・

    必要なものを足してみたのですがだめです。何かだめかお分かりになりますでしょうか?
    まずは、Splitなしの貼り付けだけ。

    「[ExcelVBA] For Input」の補足画像3
      補足日時:2016/03/08 04:43
  • うーん・・・

    ありがとうございます。 もう2つお聞きしてよろしいですか? 実際のファイルは複雑で数値が多様にあります。そこで質問ですが、Data2のところがもし”Row Data 2”となっている場合。If InStr(lineBuf, "Data2") <> 0 Then のところは If InStr(lineBuf, "Row Data 2") <> 0 Thenでしょうか。それとも、If InStr(lineBuf, "Row”, "Data", "2") <> 0 Then でしょうか それとも、If InStr(lineBuf, "Row” &"Data" & "2") <> 0 Thenでしょうか? 、

      補足日時:2016/03/08 13:10
  • うーん・・・

    もう一つは
    ary = Split(lineBuf, " ") 'lineBufをスペースで分割する。
    If ary(1) = strFind Then 'Aの次の数字が検索文字ならば

    のary(1)はどこを指しているのでしょうか。”A”と簡単にしてましたが、実際は文字が入り”Act"です。
    また”lineBuf”もどこを指しているのでしょうか? お答えできれば幸いです。ありがとうございます。

      補足日時:2016/03/08 13:16
  • つらい・・・

    ありがとうございます。いろいろファイルの違うものに変更すると、
    If ary(1) = strFind Then でまだ、「型が一致しません」のエラーがでています。
    aryなのでTextファイルでは共通だと思うのですが、型が一致しないのは、おそらくデータがDのほかにたくさんあるからだと思っています。しかし解決方法がネットでも見つかりません。うまい解決法はあるのでしょうか? すみません。

      補足日時:2016/03/09 14:30
  • つらい・・・

    ありがとうございます。いろいろファイルの違うものに変更すると、
    If ary(1) = strFind Then でまだ、「型が一致しません」のエラーがでています。
    aryなのでTextファイルでは共通だと思うのですが、型が一致しないのは、おそらくデータがDのほかにたくさんあるからだと思っています。しかし解決方法がネットでも見つかりません。うまい解決法はあるのでしょうか? すみません。

      補足日時:2016/03/09 14:30

A 回答 (4件)

> いろいろファイルの違うものに変更すると、


> If ary(1) = strFind Then でまだ、「型が一致しません」のエラーがでています。

> しかし解決方法がネットでも見つかりません。うまい解決法はあるのでしょうか?

エラーが起きる具体的なテキストデータがわからないと、なんとも答えようがないです。
    • good
    • 0
この回答へのお礼

ありがとうございました。いろいろと、試しましたが、うまくいかず、時間もないのであきらめることにしました。 また何かありましたらどうぞよろしくお願いいたします。

お礼日時:2016/03/11 03:21

> Data2のところがもし”Row Data 2”となっている場合。

If InStr(lineBuf, "Data2") <> 0 Then のところは 

If InStr(lineBuf, "Row Data 2") <> 0 Then で良いと思います。


> ary = Split(lineBuf, " ") 'lineBufをスペースで分割する。
> If ary(1) = strFind Then 'Aの次の数字が検索文字ならば
>
> のary(1)はどこを指しているのでしょうか。”A”と簡単にしてましたが、実際は文字が入り”Act"です。
> また”lineBuf”もどこを指しているのでしょうか?

linBuf は、ファイルから読み取った一行分のデータです。
(Line Input #fileNo, lineBuf で読み取っています)

ary(1)については、例えば lineBuf = "A 90, B -23.3, C 0.5, D 9" だとすると。
 ary = Split(lineBuf, " ")
によって、スペース(" ")によって分割された要素がary(n)に代入されるので、
 ary(0) = "A"
 ary(1) = "90,"
 ary(2) = "B"
 ……
 ary(7) = "9"
となります。
従ってary(1)は、Aの次の数値+カンマになります。
    • good
    • 1

補足いただいた内容に即して変更してみました。


・ファイルをダイアログで選択
・検索文字列(数字)を入力させる
・適合した行を空白で分割し、カンマを削除後、A列からH列に書き込む

----------------------------------
Sub aaa()
Dim textFile As String
Dim strFind As String
Dim isData2 As Boolean: isData2 = False
Dim targetCell As Range, target As Range
Dim fileNo As Long
Dim lineBuf As String
Dim ary As Variant, e As Variant


textFile = Application.GetOpenFilename("Log File (*.log),*.log", 1, "Select LOG File")
If textFile = "False" Then
Exit Sub 'ファイル選択キャンセル時は終了
End If
strFind = InputBox("Input number(s)") ' 検索文字列入力


strFind = strFind & "," ' カンマ追加
Set targetCell = Range("A1") 'ペースト開始セル
fileNo = FreeFile()
Open textFile For Input As #fileNo
Do Until EOF(fileNo)
Line Input #fileNo, lineBuf
If Not isData2 Then 'Data1部分は無視
If InStr(lineBuf, "Data2") <> 0 Then
isData2 = True
End If
Else 'Data2部分
Set target = targetCell

ary = Split(lineBuf, " ") 'lineBufをスペースで分割する。
If ary(1) = strFind Then 'Aの次の数字が検索文字ならば
For Each e In ary '分割した要素一つひとつについて
If right(e, 1) = "," Then '右端がカンマなら削除
e = left(e, Len(e) - 1)
End If
target.Value = e 'セルに書きこみ
Set target = target.Offset(0, 1) 'セルを一つ右へ
Next
Set targetCell = targetCell.Offset(1, 0) 'セルを一つ下へ移動
End If

End If
Loop
Close #fileNo
End Sub
    • good
    • 1
この回答へのお礼

ありがとうございました。原因がわかりました。
データがこのようになっていました。解決方法はありますか?
Data1
A 0.00, B -23.3, C 0.5, D 9
A 90.00, B -42.5, C 0.4, D 9
A 45.00, B -21.6, C 0.25, D 9
A 90.00, B 23.5, C 0.7, D 9

Data2
A 0.00, B -23.3, C 0.5, D 9
A 0.00, B -42.5, C 0.4, D 9
A 45.00, B -21.6, C 0.25, D 9
A 0.00, B 23.5, C 0.7, D 9

Data2
A 90.00, B -23.3, C 0.5, D 9
A 90.00, B -42.5, C 0.4, D 9
A 45.00, B -21.6, C 0.25, D 9
A 90.00, B 23.5, C 0.7, D 9

お礼日時:2016/03/12 03:12

仕様がいまひとつ理解できなかったので、間違っていたらゴメンなさい。



以下の動作をします。
・指定のテキストファイルを開き、一行ずつ読み込む
・「Data2」行までは何もしないで読み捨てる。
・「検索文字列」で始まる行があったら、順にA1セルから下に向かってペーストする。

質問欄のデータですとA1~A3セルにData2の”A 90"で始まる3行が書き込まれます。

--------------------------------------------------
Sub aaa()
Dim textFile As String
Dim strFind As String
Dim isData2 As Boolean: isData2 = False
Dim targetCell As Range
Dim fileNo As Long
Dim lineBuf As String

textFile = ThisWorkbook.Path & "\sample.txt" 'テキストファイル
strFind = "A 90" ' 検索文字列
strFind = strFind & "," 'カンマを追加
Set targetCell = Range("A1") 'ペースト開始セル

fileNo = FreeFile()
Open textFile For Input As #fileNo
Do Until EOF(fileNo)
Line Input #fileNo, lineBuf
If Not isData2 Then 'Data1部分は無視
If InStr(lineBuf, "Data2") <> 0 Then
isData2 = True
End If
Else 'Data2部分
If InStr(lineBuf, strFind) = 1 Then '検索文字列で始まる行ならば
targetCell.Value = lineBuf
Set targetCell = targetCell.Offset(1, 0) 'セルを一つ下へ移動
End If
End If
Loop
Close #fileNo
End Sub
    • good
    • 1

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