Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


12050 / 13646 ツリー ←次へ | 前へ→

【12628】データ形式が、CSVやタブ形式など不特定... さんい 04/4/9(金) 15:10 質問
【12643】Re:データ形式が、CSVやタブ形式など不特定... Jaka 04/4/9(金) 17:11 回答
【12650】Re:データ形式が、CSVやタブ形式など不特... さんい 04/4/9(金) 17:40 質問
【12656】Re:データ形式が、CSVやタブ形式など不特... kein 04/4/9(金) 21:38 発言
【12659】Re:データ形式が、CSVやタブ形式など不特... さんい 04/4/10(土) 13:11 質問
【12662】Re:データ形式が、CSVやタブ形式など不特... kein 04/4/10(土) 22:27 回答
【12663】Re:データ形式が、CSVやタブ形式など不特... kein 04/4/10(土) 22:37 発言
【12676】Re:エラーがでますが、・・・ さんい 04/4/12(月) 10:17 質問
【12686】Re:エラーがでますが、・・・ Kein 04/4/12(月) 15:32 発言
【12690】Re:エラーがでますが、・・・ さんい 04/4/12(月) 15:48 質問
【12691】Re:エラーがでますが、・・・ Kein 04/4/12(月) 15:57 発言
【12692】Re:ありがとうございます。 さんい 04/4/12(月) 16:08 お礼
【12693】Re:ありがとうございます。 Kein 04/4/12(月) 16:49 発言
【12695】Re:ありがとうございます。 さんい 04/4/12(月) 17:50 お礼

【12628】データ形式が、CSVやタブ形式など不特定...
質問  さんい  - 04/4/9(金) 15:10 -

引用なし
パスワード
   読み込むデータの形式がCSVやタブ形式など不特定なデータの配列があり、
しかもその列数(データ数)がわからない場合でも、
フォーム上の読み込みボタン(コマンドボタン)を押すと、フォーム上に表(ひょう)が表示され、スクロールバーを使えば列数がいくつまでデータが入っているかが確認できる・・・そんなことをしたいのですが、こんなことVBAでできますでしょうか?
つまり、
VntSelectBook = Application.GetOpenFilename("すべてのファイル(*.*),*.*", , "ブックを選択(複数選択可", , true)
のようなコマンドではじまって、そのデータファイルを開くことなしに
データ数がわかって、しかも計算したいデータが何列目と何列目に入っているかを小さなウインドウで覗き見して、計算するということをしたいのです。
どうかご教授のほどよろしくお願いいたします。

【12643】Re:データ形式が、CSVやタブ形式など不特...
回答  Jaka  - 04/4/9(金) 17:11 -

引用なし
パスワード
   こんにちは。

こう言うのとは、違うんですよね。

[#6643]

【12650】Re:データ形式が、CSVやタブ形式など不特...
質問  さんい  - 04/4/9(金) 17:40 -

引用なし
パスワード
   ▼Jaka さん:
>こんにちは。
>
>こう言うのとは、違うんですよね。
>
>[#6643]
Jakaさん。こんにちわ。
早速回答をしてくださり、ありがとうございます。
ほぼこれなのですが、エクセル特有の列のA,B,Cが見えないですよね。ここが見れると助かるのですが。(何のデータが何番目の列にはいっている)とか。
それと、最後(「完了」の直前)まで進むとキャンセルボタンを押さないと本当にデータがセルに入ってしまいますよね。これを大体のデータの配列がわかったら、すぐその直後に3列目と8列目を足し算するというようなコマンドにするのはどうしたらいいのでしょうか?
やはり、いったんキャンセルボタンを押すしかないのでしょうか?
追加ですみません。教えてください。

【12656】Re:データ形式が、CSVやタブ形式など不特...
発言  kein  - 04/4/9(金) 21:38 -

引用なし
パスワード
   WinNT系OSで動くものらしいので、動作を確認できませんが↓こんなフリーソフトを
使ってみたらどうでしょーか ?
http://www.vector.co.jp/soft/winnt/util/se284156.html

【12659】Re:データ形式が、CSVやタブ形式など不特...
質問  さんい  - 04/4/10(土) 13:11 -

引用なし
パスワード
   keinさんこんにちは。
まさにこんな感じです。うれしいです。
ありがとうございます。
しかし,このあとデータ配列を確認してから計算の連続処理をしたいのです。
そのため,一個のVBAプログラムで流れ作業をさせたいのですが,
いい方法はないでしょうか?
(紹介していただいたソフトで確認した後に再びエクセルを開かずに)
よろしくお願いいたします。

【12662】Re:データ形式が、CSVやタブ形式など不特...
回答  kein  - 04/4/10(土) 22:27 -

引用なし
パスワード
   いろいろやってみましたが、一応こんな感じのプログラムでナンとか形に
なりました。ちなみにこちらのテスト環境は Win98 + Excel2000 です。

Sub MyTxtView_GetData()
  Dim MyF As String, SFn As String, MySt As String
  Dim FSO As Object
  Dim Lin As Variant, NAry As Variant, C As Variant
  Dim x As Long, y As Long, Ofp As Long, i As Long
  Dim NAry2() As Long
  Dim Ck As Boolean, Ck2 As Boolean
  Const FSt As String = _
  "テキストファイル(*.txt;*.csv),*.txt;*.txt"
  Const ComSt As String = "COMMAND.COM /K EDIT /R "
 
  ChDir "C:\My Documents"
  MyF = Application.GetOpenFilename(FSt)
  If VarType(MyF) = 11 Then Exit Sub
  Set FSO = CreateObject("Scripting.FileSystemObject")
  SFn = FSO.GetFile(MyF).ShortPath
  CreateObject("WScript.Shell").Run ComSt & SFn, 1, True
  Do
   Ck = False: Ck2 = False
   Lin = Application.InputBox("シートに入力する行番号を" & _
    vbLf & "カンマ又はスペース区切りで入力", Type:=3)
   x = InStr(1, Lin, ","): y = InStr(1, Lin, ChR(32))
   If x > 0 Then
     NAry = Split(Lin, ",")
     For Each C In NAry
      If Not IsNumeric(C) Then
        Ck = True: Exit For
      End If
     Next
   ElseIf y > 0 Then
     NAry = Split(Lin, ChR(32))
     If UBound(NAry) <> 1 Then
      Ck = True
     End If
     If Not IsNumeric(NAry(0)) Or _
     Not IsNumeric(NAry(1)) Then
      Ck = True
     End If
     Ck2 = True
   Else
     Ck = True
   End If
  Loop While Ck = True
  If Ck2 = True Then
   For i = NAry(0) To NAry(1)
     ReDim Preserve NAry2(i): NAry2(i) = i
   Next i
  Else
   For i = LBound(NAry) To UBound(NAry)
     ReDim Preserve NAry2(i): NAry2(i) = NAry(i)
   Next i
  End If
  Erase NAry
  With FSO.OpenTextFile(MyF)
   Do Until .AtEndOfStream
     If IsError(Application.Match(.Line, NAry2, 0)) Then
      .SkipLine
     Else
      MySt = .ReadLine
      ActiveCell.Offset(Ofp).Value = MySt
      Ofp = Ofp + 1
     End If
   Loop
   .Close
  End With
  Set FSO = Nothing: Erase NAry2
  Range(ActiveCell, ActiveCell.End(xlDown)) _
  .TextToColumns DataType:=xlDelimited, Tab:=True, Comma:=True, _
  Space:=True, ConsecutiveDelimiter:=True
  ChDir Application.DefaultFilePath
End Sub

*準備
1
>ChDir "C:\My Documents"
を、そちらでテキストファイルを保存しているパスに変更する。
2
>Const ComSt As String = "COMMAND.COM /K EDIT /R "
を、Win2000,WinXP を使っている場合

Const ComSt As String = "CMD.EXE /K EDIT /R "

に変更する。
3
空白シートを開き、データの入力を開始するセルを1つ選択する。
(このセルから入力したデータを、カンマ・スペース・タブのいずれの場合も
区切り文字として、右隣りの各列へ分割・展開します。従って右隣りに充分な
空白列を確保しておいて下さい。)

*使い方
準備が済んでマクロを実行すると、初めに目的のテキストを指定するダイアログ
が出ます。これでファイルを選択して OK を押すと、DOS窓が開いてテキストの
内容が表示されます。[↑],[↓]の方向キーを押していくと、DOS画面の右下に
カーソル位置の行番号が表示されます。([←],[→]のキーは列の表示になりますが、
これは関係ないので触らないで下さい)
取りこみたい行番号をメモしておきます。このとき飛び飛びの行ならカンマ区切り、
連続した行番号だけならスペース区切りにすることを、念頭において下さい。
DOS画面右上端の×ボタンで、窓を閉じます。ここで警告メッセージが出ますが
構わず OK して閉じて下さい。次に、行番号を入力する InputBox が出ます。
ここで先にメモした番号を、飛び飛びなら "3,7,10,11,14 ・・"というように
カンマ区切りで、連続した行番号は "3 14" とスペース区切りで始めと終わりの
数値を入力します。OK を押すと正しく入力されている場合のみ、アクティブセル
以下にデータが入力されていき、最後にテキストの区切り文字に従って各セルに
分割されます。InputBox の入力値が正しく取得されるまで、繰り返しボックスが
出てきます。

ま、そんなところですが、VBAだけを駆使してプログラミングするなら、こんな
程度が限界かも知れません・・。

 

【12663】Re:データ形式が、CSVやタブ形式など不特...
発言  kein  - 04/4/10(土) 22:37 -

引用なし
パスワード
   >計算の連続処理
については、分割入力されたセルの値を参照する数式を立てる、ということに
なります。どんな計算をしたいのか分かりませんが、セル分割後に入力された
値の位置を正しく参照しないと、全ての処理が無駄になると考えて下さい。

【12676】Re:エラーがでますが、・・・
質問  さんい  - 04/4/12(月) 10:17 -

引用なし
パスワード
   Keinさん。おはようございます。
具体的な内容をお寄せいただきありがとうございます。
ところで、実際に保存しているパスに変更し、XP用にコマンド名も変更してトライいたしましたが、
「'EDIT'は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。」というエラー文が頭に出て、
その下の行にc:\Documents and Settings\・・・
というタイプが出て、止まってしまいました。すなわちテキストの内容が表示されませんでした。
どうしたらよいでしょう?
ご指導いただけますでしょうか?

【12686】Re:エラーがでますが、・・・
発言  Kein  - 04/4/12(月) 15:32 -

引用なし
パスワード
   あちゃ・・やっぱりWinXPでは、サポートされてないコマンドなんですね・・。
DOSコマンドのリファレンスサイトには、Win98系が Me まで、NT系は 4.0 まで
使えるという記事が出ていましたが、Win2000,XPでは使えなくなったわけですね。
仕方ないんで、ちょっと DOSプロンプトを立ち上げてカーソル位置から

EDLIN テキストファイルのフルパス /P

とタイプしてみてください。コマンドとパスとスイッチは、半角スペースで区切って
入力します。これがうまくいけば EDLINコマンドに変更すれば良いのです。
なにぶんこちらは Win98 のみしかテストできないので、結果は分かりませんが、
Webで検索したところ、WinXPでも使えるような記事を見かけました。
もしダメなら、行を数えるのにいちいち目視でやるのを覚悟で、TYPE コマンドを
使うぐらいしかなくなりますね・・それなら Shell関数でメモ帳やワードパッド
を起動してファイルを開くのと、変わりは無くなりますけど。

【12690】Re:エラーがでますが、・・・
質問  さんい  - 04/4/12(月) 15:48 -

引用なし
パスワード
   Keinさん。こんにちは。

早速ありがとうございます。
ところで、
アクセサリの中にコマンドプロンプトというのがありまして、
実行しましたら、パラメータが違います。と、
でてきました。
だめなのでしょうか?

【12691】Re:エラーがでますが、・・・
発言  Kein  - 04/4/12(月) 15:57 -

引用なし
パスワード
   Sub Test_ED()
  Shell "CMD.EXE /K EDLIN C:\TEMP\TEST.TXT", 1
End Sub

というマクロで、ファイルパスを実在のものに変更して実行してみて下さい。
うまくいかなかったら、EDLINコマンドも WinXP で使えなくなった、という
ことです。そーなると先に書いたように、メモ帳でファイルを表示するぐらいしか
思いつきません。ファイルサイズが小さいなら、目視で行の順番をチェックする
ことも出来ますが、何百、何千行もあったらちょっと手に負えなくなりますね・・。

【12692】Re:ありがとうございます。
お礼  さんい  - 04/4/12(月) 16:08 -

引用なし
パスワード
   Keinさん。何度もつきあっていただきありがとうございました。
しかし、パラメータが違います、と再び出てしまいました。
残念です。
でも、ほんとうに最後まで親切丁寧に教えていただきありがとうございました。
感謝しています。

【12693】Re:ありがとうございます。
発言  Kein  - 04/4/12(月) 16:49 -

引用なし
パスワード
   最後に一つ、CMD.EXE を COMMAND.COM に変更して EDIT, EDLIN を試して
みて下さい。それでダメなら、残念ながら無理です。

【12695】Re:ありがとうございます。
お礼  さんい  - 04/4/12(月) 17:50 -

引用なし
パスワード
   Keinさん。
また、また、ありがとうございます。
EDITの場合は、「コマンドまたは、ファイル名が違います。」
と、でて
EDITLINの場合は、「パラメータが違います。」
というエラーガでました。

ファイル名は間違っていないか一応確認してみたのですが、
自信がなくなってきました。

12050 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free