Excel VBA質問箱 IV

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

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


56064 / 76732 ←次へ | 前へ→

【25433】Re:値・文字データがランダムに入ったテキストファイル抽出について
回答  Hirofumi  - 05/5/31(火) 20:57 -

引用なし
パスワード
   ま、半分冗談の積もりで作って見ました
条件は、
Array(10, 15, 5, 8, 3, 5, 10(文字), 5, 10(文字), 2, 6, 6, 6, 6)
の中で、2ヶ所「10(文字)」の位置が、不定数の全角文字と半角スペースで構成され
その他のフィールドは、半角数字で構成されたTextで
1行づつ改行されている物と考えます
上手く行かなかったらゴメン

Option Explicit

Public Sub Sample()

  Dim i As Long
  Dim lngRow As Long
  Dim dfn As Integer
  Dim vntFileName As Variant
  Dim strBuff As String
  Dim vntField As Variant
  Dim rngResult As Range
  Dim strDataPath As String
  
  'データの有るPathを指定
'  strDataPath = "C:\Documents and Settings\Owner\My Documents"

  'ファイル名を指定(拡張子は無し、ここを指定しなければ、
  '指定された拡張子の全てのファイル名表示)
'  vntFileName = "でーたもと"

  'ファイルを開くダイアログ表示
  If Not GetReadFile(vntFileName, strDataPath) Then
    Exit Sub
  End If

  '結果を書き込むシートの先頭セル位置を指定
  Set rngResult = ActiveSheet.Cells(1, "A")
  
  'ファイルをInputモードでOpen
  dfn = FreeFile
  Open vntFileName For Input As dfn
  
  'ファイルEndまで繰り返し
  Do Until EOF(dfn)
    '1行変数に読み込み
    Line Input #dfn, strBuff
    '1行をフィールドに分割
    vntField = DataSplit(strBuff)
    '指定したシートの指定したセルに就いて
    With rngResult.Offset(lngRow)
      '先頭2セルの書式を文字列に指定
      .Resize(, 2).NumberFormatLocal = "@"
      '指定したシートにデータを書き込み
      .Resize(, UBound(vntField) + 1).Value = vntField
    End With
    '書き込み行を更新
    lngRow = lngRow + 1
  Loop
  
  'ファイルをClose
  Close #dfn
    
  Set rngResult = Nothing
  
  Beep
  MsgBox "処理が完了しました"
  
End Sub

Private Function DataSplit(strMark As String) As Variant

  Dim i As Long
  Dim lngPos As Long
  Dim vntSplit As Variant
  Dim vntField As Variant
  Dim strLetter As String
  
  'フィールド長を指定(-1の場合、半角数字が出るまで文字を連結)
  vntSplit = Array(10, 15, 5, 8, 3, 5, -1, 5, -1, 2, 6, 6, 6, 6)
  '結果用配列を確保
  ReDim vntField(UBound(vntSplit))
  
  '読み込み位置の初期値設定
  lngPos = 1
  'フィールド数分繰り返し
  For i = 0 To UBound(vntSplit)
    'もし、フィールド長が-1で無ければ
    If vntSplit(i) <> -1 Then
      '読み込み位置から、指定フィールド長分文字を切り出して
      '結果用配列に格納
      vntField(i) = Mid(strMark, lngPos, vntSplit(i))
      '読み込み位置を更新
      lngPos = lngPos + vntSplit(i)
    Else
      '-1の場合、半角数字が出るまで文字を連結
      strLetter = Mid(strMark, lngPos, 1)
      Do Until 48 <= Asc(strLetter) And Asc(strLetter) <= 57
        vntField(i) = vntField(i) + strLetter
        lngPos = lngPos + 1
        strLetter = Mid(strMark, lngPos, 1)
      Loop
    End If
  Next i

  '戻り値として、結果用配列を返す
  DataSplit = vntField
  
End Function

0 hits

【25287】値・文字データがランダムに入ったテキストファイル抽出について おソラ 05/5/26(木) 15:58 質問
【25295】Re:値・文字データがランダムに入ったテ... 小僧 05/5/27(金) 10:00 回答
【25374】小僧さん・「Unicode」の指定方法について おソラ 05/5/30(月) 10:24 質問
【25384】Re:小僧さん・「Unicode」の指定方法につ... 小僧 05/5/30(月) 11:37 発言
【25420】Re:小僧さん・「Unicode」の指定方法につ... おソラ 05/5/31(火) 13:15 質問
【25422】Re:小僧さん・「Unicode」の指定方法につ... 小僧 05/5/31(火) 14:05 発言
【25425】小僧さん・「Unicode」の指定方法につ... おソラ 05/5/31(火) 15:05 発言
【25421】Re:値・文字データがランダムに入ったテキ... おさる 05/5/31(火) 13:32 発言
【25424】おさるさん おソラ 05/5/31(火) 14:33 発言
【25433】Re:値・文字データがランダムに入ったテキ... Hirofumi 05/5/31(火) 20:57 回答
【25436】プロシージャ1つ書き忘れました Hirofumi 05/5/31(火) 22:15 回答
【25450】Hirofumi さん おソラ 05/6/1(水) 10:01 お礼
【25451】Re:Hirofumi さん m2m10 05/6/1(水) 10:07 回答
【25456】Hirofumi さん m2m10さん 集計の件 おソラ 05/6/1(水) 11:52 発言
【25457】Re:Hirofumi さん m2m10さん 集計の件 Jaka 05/6/1(水) 13:06 発言
【25471】Jaka さん おソラ 05/6/1(水) 17:04 お礼

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