Excel VBA質問箱 IV

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

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


10874 / 13644 ツリー ←次へ | 前へ→

【19205】固定長のテキストをスマートに切りだしながら取り込みたい ackkn 04/10/25(月) 16:01 質問[未読]
【19207】Re:固定長のテキストをスマートに切りだし... Kein 04/10/25(月) 16:34 回答[未読]
【19210】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/25(月) 17:19 発言[未読]
【19209】Re:固定長のテキストをスマートに切りだし... Jaka 04/10/25(月) 17:04 回答[未読]
【19211】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/25(月) 17:29 発言[未読]
【19212】Re:固定長のテキストをスマートに切りだし... Jaka 04/10/25(月) 17:41 回答[未読]
【19214】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/25(月) 19:14 質問[未読]
【19215】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/25(月) 20:12 質問[未読]
【19230】Re:固定長のテキストをスマートに切りだし... Jaka 04/10/26(火) 9:43 回答[未読]
【19233】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/26(火) 12:06 発言[未読]
【19256】Re:固定長のテキストをスマートに切りだし... Jaka 04/10/26(火) 16:54 発言[未読]
【19282】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/27(水) 12:08 質問[未読]
【19283】Re:固定長のテキストをスマートに切りだし... Jaka 04/10/27(水) 12:37 発言[未読]
【19303】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/27(水) 20:11 お礼[未読]
【19216】Re:固定長のテキストをスマートに切りだし... Hirofumi 04/10/25(月) 20:18 回答[未読]
【19223】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/25(月) 22:50 発言[未読]
【19270】Re:固定長のテキストをスマートに切りだし... ackkn 04/10/27(水) 9:48 質問[未読]
【19304】Re:固定長のテキストをスマートに切りだし... Hirofumi 04/10/27(水) 20:57 回答[未読]
【19434】Re:固定長のテキストをスマートに切りだし... ackkn 04/11/2(火) 18:35 お礼[未読]

【19205】固定長のテキストをスマートに切りだしな...
質問  ackkn  - 04/10/25(月) 16:01 -

引用なし
パスワード
   いつもお世話になっております。
固定長(100byte(CRLF含まず))のテキストファイル(約1,500行程度)を決まった桁毎(2桁、3桁、3桁(全角漢字)、4桁、5桁、13桁・・・(計15カラム))に切り出しながらスマートに取り込む方法をどなたかご教示下さい。
よろしくお願いします。

(例)
40645りんご0993000002007117800231・・・・・
     ↓     ↓     ↓
1| A | B |  C  | D |  E |    F   | G | H | I
--------------------------------------------------------------------
2| 40 | 645 | りんご| 0993| 00000| 2007117800231| ・・・・|・・・ |
--------------------------------------------------------------------

【19207】Re:固定長のテキストをスマートに切りだ...
回答  Kein  - 04/10/25(月) 16:34 -

引用なし
パスワード
   まずは OpenTextメソッドのヘルプを調べてみて下さい。

【19209】Re:固定長のテキストをスマートに切りだ...
回答  Jaka  - 04/10/25(月) 17:04 -

引用なし
パスワード
   スマートだかどうだかはわかりません。
1500行程度と言う事なんで....。

因みにこれ以上配列をでかくすると、どんどん遅くなると思います。
限度を超えるとフリーズしたりもします。

Sub dkkk()
  Dim St() As String
  OPFL = "開くファイルのフルパス"
  Open OPFL For Input As #1
  Do Until EOF(1)
    CT = CT + 1
  Loop
  Close #1
  Open OPFL For Input As #1
  CC = 0
  ReDim St(1 To CT, 1 To 15)
  Do Until EOF(1)
    Line Input #1, RD
    CC = CC + 1
    St(CC, 1) = Left(RD, 2)
    St(CC, 2) = Mid(RD, 3, 3)
    St(CC, 3) = Mid(RD, 6, 3)
    St(CC, 4) = Mid(RD, 9, 4)
    St(CC, 5) = Mid(RD, 13, 5)
     ・
     ・
    St(CC,15) = Mid(RD, ×, ×)
  Loop
  Range("A1").Resize(CT, 15).Value = St
  Close #1
  Erase St
  End
End Sub

【19210】Re:固定長のテキストをスマートに切りだ...
発言  ackkn  - 04/10/25(月) 17:19 -

引用なし
パスワード
   ▼Kein さん:
>まずは OpenTextメソッドのヘルプを調べてみて下さい。
Kein さん、こんにちは!
いつもお世話になります、早速のレスありがとうございます。
でも、まるで私の質問はKein さんが専属で答えるもんだみたいなタイミングで入れて貰って...ありがとうございます。
さて、本題に戻りましょう。
>まずは OpenTextメソッドのヘルプを調べてみて下さい。
自分では努力もせずに...とんでもありません!
当然、あれやこれやと調べたんですが、FSO のOpenTextFileメソッドや上記の
OpenTextメソッドなど色々と見つかった物ですから、固定長のファイルから決まった形で切り出す場合は、どのような手法が一番スマートなんでしょうか?
また、OpenTextメソッドの引数の中に FieldInfo なるものがあり、配列の形式は
Array(Array(x,y),Array(x,y)...)で、・・・ との説明があったのですが、そこは如何せん初心者ですもの「何の事?」になってしまった訳です。
テキストを開いて読み込む迄は何とかなりそうなんですが、問題は切り出しの部分です、どうやったら一番スマートで早いのでしょうか?
何卒、よろしくお願いします。

【19211】Re:固定長のテキストをスマートに切りだ...
発言  ackkn  - 04/10/25(月) 17:29 -

引用なし
パスワード
   ▼Jaka さん:
>スマートだかどうだかはわかりません。
>1500行程度と言う事なんで....。
Jaka さん、こんにちは!
お久しぶりです、またお世話になります。
ほんの今し方、Kein さんに返信したところでした。
レスありがとうございます。
早速試してみたいと思います。
Kein さんへの発言を確認して頂くとありがたいです。
OpenTextメソッドのfieldInfoを使うと、何か出来そうなんですけど...
形に迄出来ないところが歯痒い!
よろしくお願いします。

【19212】Re:固定長のテキストをスマートに切りだ...
回答  Jaka  - 04/10/25(月) 17:41 -

引用なし
パスワード
   ▼ackkn さん:
>OpenTextメソッドのfieldInfoを使うと、何か出来そうなんですけど...
マクロ記録をしたらいいと思います。

【19214】Re:固定長のテキストをスマートに切りだ...
質問  ackkn  - 04/10/25(月) 19:14 -

引用なし
パスワード
   ▼Jaka さん:
Jaka さん、こんばんは。
>マクロ記録をしたらいいと思います。
そうですね!、一瞬えーって思ったんですが、出来ました。
これはこれで勉強になったんですが、今ひとつの応用が利かなくて(私が)...
1) 別のブックになってしまう。
2) フィールドのタイプが標準と文字列の2つしか設定できない。
 (正確には他にも日付とスキップはあるが、数値がない)
これらは、Workbooks.OpenText の場合は仕方がないんですよね?
私が出来ないだけだったりして(^^;)

【19215】Re:固定長のテキストをスマートに切りだ...
質問  ackkn  - 04/10/25(月) 20:12 -

引用なし
パスワード
   ▼Jaka さん:
>スマートだかどうだかはわかりません。
>1500行程度と言う事なんで....。
試したんですが、Dim を数行追加してどうにか走ったと思ったら
帰らぬひととなられました。(-_-)
追加したのは、DimのOPFL、CT、CC、RD です。
再度、ステップ実行で調べたところ、最初のCTを求めるループで、EOFにならず、
無限ループになっていました。
なぜですかね?
EOFがないなら、Workbooks.OpenText でもエラーになるのでは?

【19216】Re:固定長のテキストをスマートに切りだ...
回答  Hirofumi  - 04/10/25(月) 20:18 -

引用なし
パスワード
   こんなやり方も有るよ
基本的には、BinaryモードでInputB関数で読み込みます
「読込設定」と言う名前の、WorkSheetを作り、
このシートに設定したバイト数、列見出し、書式、Fillerを使用してファイルを読み込みます
WorkSheets("読込設定")の、B1から、C1、D1・・・と列見出しと成る文字列をセルに書き込みます
同じく、B2、C2、D2・・・と、ファイールドのバイト長を設定します
同じく、B3、C3、D3・・・と、セルの書式を数値で設定します(1が標準、2が文字列、3が日付、設定無しの場合は標準)
同じく、WorkSheets("読込設定")のB6には、改行コードのバイト数を設定(vbCrLfなら2、改行コード無しなら0)
データが書き込まれるWorkSheetは、Upしたコードではアクティブシートです
検証不足なので上手くいかなかったらゴメン

Option Explicit

Public Sub ReadFixdTextBin()

  Dim wksSetUp As Worksheet
  Dim wksWrite As Worksheet
  Dim vntFieldLen As Variant
  Dim lngRecLen As Long
  Dim lngLineMax As Long
  Dim vntFileName As Variant
  Dim lngWriteRow As Long
  Dim lngWriteCol As Long

  'ディフォルトのファイル名を指定
'  vntFileName = "TestFile.txt"
  If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
    Exit Sub
  End If
  'Openするファイル名を設定
'  vntFileName = ThisWorkbook.Path & "\" & "TestFile.txt"
'  If Dir(vntFileName) = "" Then
'    Beep
'    MsgBox vntFileName & vbCrLf & "ファイルが有りません"
'    Exit Sub
'  End If

  '画面更新を停止
  Application.ScreenUpdating = False
  
  '書き込み行の初期値を設定
  lngWriteRow = 1
  '書き込み列の初期値を設定
  lngWriteCol = 1
  '「設定」シートの参照を設定
  Set wksSetUp = ThisWorkbook.Worksheets("読込設定")
  '書き込むシート名の参照を設定
  Set wksWrite = ActiveSheet
  
  '設定シートよりフィールド情報の読み込み
  lngRecLen = GetReadField(vntFieldLen, wksSetUp)
  
  '総行数確認
  lngLineMax = FileLen(vntFileName) \ lngRecLen
  If lngLineMax + lngWriteRow > 65536 Then
    Beep
    MsgBox "Dataが" & lngLineMax & _
      "行有り、65536行を超えています", _
          vbExclamation + vbOKOnly, "OverFlow"
    Exit Sub
  End If
  
  '列見出しの書き込み
  PutFieldNames lngWriteRow, lngWriteCol, wksSetUp, wksWrite
  lngWriteRow = lngWriteRow + 1
  
  'セルの書式設定
  CellsFormat lngWriteRow, lngWriteCol, _
          vntFieldLen, lngLineMax, wksWrite
  
  
  SDFRead vntFileName, vntFieldLen, lngRecLen, _
        wksWrite, lngWriteRow, lngWriteCol
  
  With wksWrite
    .Cells.EntireColumn.AutoFit
    .Cells(1, 1).Select
  End With
  
  Set wksSetUp = Nothing
  Set wksWrite = Nothing
  
  '画面更新を再開
  Application.ScreenUpdating = True
    
  Beep
  MsgBox "処理が終了しました", vbOKOnly, "終了"
    
End Sub

Private Sub SDFRead(ByVal strFileName As String, _
          vntFieldLen As Variant, _
          lngRecLen As Long, _
          ByVal wksWrite As Worksheet, _
          Optional lngRow As Long = 2, _
          Optional lngCol As Long = 1)

  'lngRow = 2 : シートのデータ書き込み先頭行位置
  'lngCol = 1 : シートのデータ書き込み先頭列位置
  
  Dim dfn As Integer
  Dim vntField As Variant
  Dim lngNumb As Long

  '設定シートよりフィールド数の取得
  lngNumb = UBound(vntFieldLen, 2)
  
  '読み込むファイルをBinaryファイルとしてOpen
  dfn = FreeFile
  Open strFileName For Binary Access Read As dfn

  '最終バイト数まで繰り返す
  Do Until LOF(dfn) <= Loc(dfn)
    'フィールドData作成
    vntField = DivideStrBinary(InputB(lngRecLen, #dfn), vntFieldLen)
    'List書きこみ
    With wksWrite.Cells(lngRow, lngCol)
      .Offset.Resize(, lngNumb).Value = vntField
    End With
    '書き込み行の更新
    lngRow = lngRow + 1
  Loop

  Close #dfn

End Sub

Private Function GetReadField(vntField As Variant, _
            ByVal wksSetUp As Worksheet) As Long

'  設定Field長、書式の読み込み

  Dim i As Long
  Dim lngColEnd As Long
  Dim lngLen As Long
  
  With wksSetUp
    lngColEnd = .Cells(2, 256).End(xlToLeft).Column
    vntField = .Range(.Cells(2, 2), .Cells(3, lngColEnd)).Value
    'レコード長の算出
    lngLen = Val(.Cells(6, 2).Value)
    For i = 1 To UBound(vntField, 2)
      lngLen = lngLen + CLng(vntField(1, i))
    Next i
  End With

  GetReadField = lngLen
  
End Function

Private Sub CellsFormat(lngRow As Long, _
            lngCol As Long, _
            vntFieldAtt As Variant, _
            lngMaxLine As Long, _
            wksWrite As Worksheet)

'  セルの書式設定
  
  Dim i As Long
  
  With wksWrite.Cells(lngRow, lngCol)
    For i = 0 To UBound(vntFieldAtt, 2) - 1
      If vntFieldAtt(2, i + 1) <> "" Then
        With .Offset(, i).Resize(lngMaxLine)
          Select Case vntFieldAtt(2, i + 1)
            Case 1
              .NumberFormatLocal = "G/標準"
            Case 2
              .NumberFormatLocal = "@"
            Case 3
              .NumberFormatLocal = "yyyy/mm/dd"
          End Select
        End With
      End If
    Next i
  End With
  
End Sub

Private Sub PutFieldNames(lngRow As Long, _
            lngCol As Long, _
            ByVal wksSetUp As Worksheet, _
            ByVal wksWrite As Worksheet)

'  列見出しの書きこみ

  Dim lngColEnd As Long
  
  If lngRow <= 0 Then
    Exit Sub
  End If
  
  With wksSetUp
    lngColEnd = .Cells(1, 256).End(xlToLeft).Column
    .Range(.Cells(1, 2), .Cells(1, lngColEnd)).Copy _
      Destination:=wksWrite.Cells(lngRow, lngCol)
  End With
  
End Sub

Private Function DivideStrBinary(ByVal strLine As String, _
                vntLength As Variant) As Variant

'  フィールドDataに分割

  Dim i As Long
  Dim lngPos As Long
  Dim vntField As Variant
  Dim intDataMax As Integer
  
  lngPos = 1
  intDataMax = UBound(vntLength, 2)
  ReDim vntField(intDataMax - 1)
  For i = 1 To intDataMax
    vntField(i - 1) _
        = Trim(StrConv(MidB(strLine, _
            lngPos, CLng(vntLength(1, i))), vbUnicode))
    lngPos = lngPos + CLng(vntLength(1, i))
  Next i
  
  DivideStrBinary = vntField
  
End Function

Private Function GetReadFile(vntFileNames As Variant, _
            Optional strFilePath As String, _
            Optional blnMultiSel As Boolean _
                    = False) As Boolean

  Dim strFilter As String
  
  'フィルタ文字列を作成
  strFilter = "CSV File (*.csv),*.csv," _
        & "Text File (*.txt),*.txt," _
        & "CSV and Text (*.csv; *.txt),*.csv;*.txt," _
        & "全て (*.*),*.*"
  '読み込むファイルの有るフォルダを指定
  If strFilePath <> "" Then
    'ファイルを開くダイアログ表示ホルダに移動
    ChDrive Left(strFilePath, 1)
    ChDir strFilePath
  End If
  'もし、ディフォルトのファイル名が有る場合
  If vntFileNames <> "" Then
    SendKeys vntFileNames & "{TAB}", False
  End If
  '「ファイルを開く」ダイアログを表示
  vntFileNames _
      = Application.GetOpenFilename(strFilter, 3, , , blnMultiSel)
  If VarType(vntFileNames) = vbBoolean Then
    Exit Function
  End If
  
  GetReadFile = True
  
End Function

【19223】Re:固定長のテキストをスマートに切りだ...
発言  ackkn  - 04/10/25(月) 22:50 -

引用なし
パスワード
   ▼Hirofumi さん:
Hirofumi さん、こんばんは。
レスありがとうございます。
早速試しながら動作を理解したいと思います。
また何かあれば、報告します。
>こんなやり方も有るよ
>基本的には、BinaryモードでInputB関数で読み込みます
・・・・・
>検証不足なので上手くいかなかったらゴメン
とんでもない!、ありがとうございます。m(_ _)m

【19230】Re:固定長のテキストをスマートに切りだ...
回答  Jaka  - 04/10/26(火) 9:43 -

引用なし
パスワード
   >再度、ステップ実行で調べたところ、最初のCTを求めるループで、EOFにならず、
>無限ループになっていました。
すみません。肝心なものが.....。

  Do Until EOF(1)
    Line Input #1, RD  '← 肝心なもの。
    CT = CT + 1
  Loop

>(正確には他にも日付とスキップはあるが、数値がない)
G/標準じゃダメなんですか?
でも、固定長ファイルでWorkbooks.OpenTextは、使えないみたいですね。
これは昨日気づいたんですが、Inputと同じで半角スペースがTrim見たいな感じで削られますね。by EXL97

>1) 別のブックになってしまう。
2000以上だったら、データ → 外部データの取り込み か、
ただのテキストを開くで場所を指定できたと思います。
こちらは、半角スペースが削られるか未確認。

【19233】Re:固定長のテキストをスマートに切りだ...
発言  ackkn  - 04/10/26(火) 12:06 -

引用なし
パスワード
   ▼Jaka さん:
Jaka さん、こんにちは。
>すみません。肝心なものが.....。
何で気付かなかったかなーーー、そうですよね!
>G/標準じゃダメなんですか?
13桁の数値が指数表現になってしまうもので...
>でも、固定長ファイルでWorkbooks.OpenTextは、使えないみたいですね。
>これは昨日気づいたんですが、Inputと同じで半角スペースがTrim見たいな感じで
>削られますね。by EXL97
そうですね、2000でもスペースは無くなっちゃいますね。
TextQualifier:=xlTextQualifierDoubleQuote で、WQuoteで括ってくれるものと思っていたら、甘かったです(^^;)
>2000以上だったら、データ → 外部データの取り込み か、
>ただのテキストを開くで場所を指定できたと思います。
>こちらは、半角スペースが削られるか未確認。
こちらのマクロはすごいマクロが記録されました(下記)
QueryTables.Add(...なるものが登場しました。
こちらもスペースに関しては、結果同じでした。
>With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Documents and Settings\Shigeru_Otsu\MyDocuments\Test\Test.txt", _
  Destination:=Range("A2"))
> .Name = "Test"
> .FieldNames = True
> .RowNumbers = False
> .FillAdjacentFormulas = False
> .PreserveFormatting = True
> .RefreshOnFileOpen = False
> .RefreshStyle = xlInsertDeleteCells
> .SavePassword = False
> .SaveData = True
> .AdjustColumnWidth = True
> .RefreshPeriod = 0
> .TextFilePromptOnRefresh = False
> .TextFilePlatform = xlWindows
> .TextFileStartRow = 1
> .TextFileParseType = xlFixedWidth
> .TextFileTextQualifier = xlTextQualifierDoubleQuote
> .TextFileConsecutiveDelimiter = False
> .TextFileTabDelimiter = True
> .TextFileSemicolonDelimiter = False
> .TextFileCommaDelimiter = False
> .TextFileSpaceDelimiter = False
> .TextFileColumnDataTypes = Array(1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
> .TextFileFixedColumnWidths = Array(2, 3, 6, 4, 5, 13, 13, 20, 20, 6, 4, 1, 1, 1, 1)
> .Refresh BackgroundQuery:=False
>End With

【19256】Re:固定長のテキストをスマートに切りだ...
発言  Jaka  - 04/10/26(火) 16:54 -

引用なし
パスワード
   半角スペースのことを考えると、LIne inputでギッタンバッタンしないとダメだと思う。
こっちの方が速いや...。Pen150 64Mの時は気づかなかったけど...。
参照設定で、Microsoft Scripting Runtime のチェックが必要。

  OPFL = "開くファイルのフルパス"
  Open OPFL For Input As #1
  Do Until EOF(1)
    Line Input #1, RD
    CT = CT + 1
  Loop
  Close #1

   ↓

  Dim OPFL As String
  Dim Fso As New Scripting.FileSystemObject
  Dim TxStm As TextStream
  OPFL = "開くファイルのフルパス"
  Set TxStm = Fso.OpenTextFile(Filename:=OPFL, IOMode:=ForReading)
  Do Until TxStm.AtEndOfLine
    TxStm.SkipLine
  Loop
  CT = TxStm.Line - 1

【19270】Re:固定長のテキストをスマートに切りだ...
質問  ackkn  - 04/10/27(水) 9:48 -

引用なし
パスワード
   ▼Hirofumi さん:
Hirofumi さん、おはようございます。
なりました、なりました、バッチリです。
で、欲が出てきたとたん、いきなり壁に激突です、助けて下さい。
というのは、読み込むファイル名が固定なので、せっかくGetReadFile関数でファイル名を取得するので、そこで指定できればと思い下記の変更をしましたら、Dir関数の行で'52'(ファイル名または番号が不正です)の実行時エラーが出ます。
Help等で調べたのですが、原因が判りません。

  'ディフォルトのファイル名を指定
  vntFileName = "SinBHKaku*.txt" ←ここと
  If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
    Exit Sub
  End If
  'Openするファイル名を設定
  'vntFileName = ThisWorkbook.Path & "\" & "Test.txt"
  vntFileName = ThisWorkbook.Path & "\" & vntFileName ←ここ
  If Dir(vntFileName) = "" Then ←ここでエラーが出ます。
    Beep
    MsgBox vntFileName & vbCrLf & "ファイルが有りません"
    Exit Sub
  End If

  それと、Function GetReadFile(vntFileNames As Variant, _
            Optional strFilePath As String, _
            Optional blnMultiSel As Boolean _
                    = False) As Boolean
  内の vntFileNames 全てを vntFileName に変えました。
何が悪かったのでしょうか?
よろしくお願いします。m(_ _)m

【19282】Re:固定長のテキストをスマートに切りだ...
質問  ackkn  - 04/10/27(水) 12:08 -

引用なし
パスワード
   ▼Jaka さん:
Jaka さん、こんにちは、レスありがとうございます。
きれいに出来ました。(半角スペース含めて)
>半角スペースのことを考えると、LIne inputでギッタンバッタンしないとダメだと>思う。
そうですね、この半角スペースをどう扱うかによって取込方が変わりそうですね。
普通(データ → 外部データの取り込み)に固定長テキストを取り込んだ場合は、Excelにて勝手にスペースは取り除かれてしまうので、それをスペースとしてキッチリ取り込みたい場合は、LIne inputでやる。
では、逆にスペースは無視してよいが、指定した場所(シート&セル)に取り込みたい場合は、
With ActiveSheet.QueryTables.Add(Connection:= _
"TEXT;C:\Documents and Settings\Shigeru_Otsu\MyDocuments\Test\Test.txt", _
Destination:=Range("A2"))
このパターンになるのでしょうか?
また、Hirofumi さんが言われたBinaryモードで取り込むやり方だと、どちらにも対応出来るような気がしますが、Jaka さんはどう思われますか?

【19283】Re:固定長のテキストをスマートに切りだ...
発言  Jaka  - 04/10/27(水) 12:37 -

引用なし
パスワード
   >また、Hirofumi さんが言われたBinaryモードで取り込むやり方だと、どちらにも対応出来るような気がしますが、Jaka さんはどう思われますか?

私は、こんな感じですから、お好きな方を使ったら良いと思います。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=79;id=FAQ

【19303】Re:固定長のテキストをスマートに切りだ...
お礼  ackkn  - 04/10/27(水) 20:11 -

引用なし
パスワード
   ▼Jaka さん:
Jaka さん、こんばんは。
レス、ありがとうございます。
>私は、こんな感じですから、お好きな方を使ったら良いと思います。
>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=79;id=FAQ
なるほど、どうあれトータルで考えたら大差ない。
よって、好みで選択せよ!、と、まあこれが結論という訳ですね。
解りました。 今回は、色々と勉強させて頂き本当にありがとうございました。
また何かあると思いますので、その節はよろしくお願い致します。

【19304】Re:固定長のテキストをスマートに切りだ...
回答  Hirofumi  - 04/10/27(水) 20:57 -

引用なし
パスワード
   >なりました、なりました、バッチリです。
>で、欲が出てきたとたん、いきなり壁に激突です、助けて下さい。
>というのは、読み込むファイル名が固定なので、せっかくGetReadFile関数でファイル名を取得するので、そこで指定できればと>思い下記の変更をしましたら、Dir関数の行で'52'(ファイル名または番号が不正です)の実行時エラーが出ます。
>Help等で調べたのですが、原因が判りません。
>
>  'ディフォルトのファイル名を指定
>  vntFileName = "SinBHKaku*.txt" ←ここと
>  If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
>    Exit Sub
>  End If
>  'Openするファイル名を設定
>  'vntFileName = ThisWorkbook.Path & "\" & "Test.txt"
>  vntFileName = ThisWorkbook.Path & "\" & vntFileName ←ここ
>  If Dir(vntFileName) = "" Then ←ここでエラーが出ます。
>    Beep
>    MsgBox vntFileName & vbCrLf & "ファイルが有りません"
>    Exit Sub
>  End If
>
>  それと、Function GetReadFile(vntFileNames As Variant, _
>            Optional strFilePath As String, _
>            Optional blnMultiSel As Boolean _
>                    = False) As Boolean
>  内の vntFileNames 全てを vntFileName に変えました。
>何が悪かったのでしょうか?
>よろしくお願いします。m(_ _)m

本来、「ディフォルトのファイル名を指定」以下の部分と
「Openするファイル名を設定」の部分は別物で、
「Openするファイル名を設定」の部分をコメントアウトして出して有ったはずですが?

理由は、「ファイルを開くダイアログ」を表示した場合は、
既存のファイルを開くので、ファイルの存在確認の必要が無いので、
通常はDirで確認する必要が無いと思います
また、「Openするファイル名を設定」以下の部分は、
ファイル名が常に固定でマクロを実行すれば、
直ぐにそのファイルを読み込み始める場合に使います
この場合、固定されたファイルが無い場合が有るのでDirで確認を取っています
因って、「Openするファイル名を設定」以下を生かす場合は、
「ディフォルトのファイル名を指定」以下の部分を、コメントアウトします

ただ、「ファイルを開くダイアログ」で、
存在しないファイルを指定する可能性が有る場合(出来たかな?)は、
「If Dir(vntFileName) = "" Then」を活かしても問題はあ、有りません
しかし、この場合、
>  vntFileName = ThisWorkbook.Path & "\" & vntFileName ←ここ
とすると、vntFileNameに、Pathが2重に入って来るのでエラーに成ると思います

もし、こう言う使い方をするなら以下の様にします

  'ディフォルトのファイル名を指定
  vntFileName = "SinBHKaku*.txt" '←ここと
  If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
    Exit Sub
  End If
'  'Openするファイル名を設定 '★要らない
'  'vntFileName = ThisWorkbook.Path & "\" & "Test.txt" '★要らない
'  vntFileName = ThisWorkbook.Path & "\" & vntFileName '←ここ ★要らない
  If Dir(vntFileName) = "" Then '←ここでエラーが出ます。
    Beep
    MsgBox vntFileName & vbCrLf & "ファイルが有りません"
    Exit Sub
  End If

尚、
>  それと、Function GetReadFile(vntFileNames As Variant, _
>            Optional strFilePath As String, _
>            Optional blnMultiSel As Boolean _
>                    = False) As Boolean
>  内の vntFileNames 全てを vntFileName に変えました。
は、する必要が有りません

【19434】Re:固定長のテキストをスマートに切りだ...
お礼  ackkn  - 04/11/2(火) 18:35 -

引用なし
パスワード
   ▼Hirofumi さん:
Hirofumi さん、こんばんは。
返事が遅くなって申し訳ありません。
>もし、こう言う使い方をするなら以下の様にします
>  'ディフォルトのファイル名を指定
>  vntFileName = "SinBHKaku*.txt" '←ここと
>  If Not GetReadFile(vntFileName, ThisWorkbook.Path, False) Then
>    Exit Sub
>  End If
>'  'Openするファイル名を設定 '★要らない
>'  'vntFileName = ThisWorkbook.Path & "\" & "Test.txt" '★要らない
>'  vntFileName = ThisWorkbook.Path & "\" & vntFileName '←ここ ★要らない
>  If Dir(vntFileName) = "" Then '←ここでエラーが出ます。
>    Beep
>    MsgBox vntFileName & vbCrLf & "ファイルが有りません"
>    Exit Sub
>  End If
>尚、
>>  それと、Function GetReadFile(vntFileNames As Variant, _
>>            Optional strFilePath As String, _
>>            Optional blnMultiSel As Boolean _
>>                    = False) As Boolean
>>  内の vntFileNames 全てを vntFileName に変えました。
>は、する必要が有りません
ご教示通り直しましたら、バッチリ思ったとおりに動きました。
本当に色々とありがとうございました。m(_ _)m
またお世話になると思いますので、その節はよろしくお願い致します。

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