過去ログ

                                Page     159
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼Array以外の方法を教えてください。  デヤン 02/10/2(水) 10:25
   ┗Re:Array以外の方法を教えてください。  Nakamura 02/10/2(水) 12:58
      ┗Re:Array以外の方法を教えてください。  デヤン 02/10/2(水) 14:11
         ┗Re:Array以外の方法を教えてください。  Hirofumi 02/10/2(水) 20:26
            ┗Re:Array以外の方法を教えてください。  Hirofumi 02/10/2(水) 21:11
               ┗Re:Array以外の方法を教えてください。  デヤン 02/10/3(木) 10:06
                  ┗Re:Array以外の方法を教えてください。  Hirofumi 02/10/3(木) 19:36

 ───────────────────────────────────────
 ■題名 : Array以外の方法を教えてください。
 ■名前 : デヤン
 ■日付 : 02/10/2(水) 10:25
 -------------------------------------------------------------------------
    初めまして、VBA初心者の者です。
特に難しくもない質問かもしれませんが教えてください。

コマンドボタンを押すと、テキストファイルを読み込み
列A〜ATまでテキストファイルのデータを分ける。
このような処理をしたいのです。
解かりにくいと思うので例えを用いて説明すると。

例え
テキストファイルに以下のデータが入っているとします。

テキストファイルのデータ:123456・・・XYZ
                  ・
                  ・
                  ・

コマンドボタンを押し、テキストファイルを読み込むと

_|A|B| C| D|・・・・|AR|AS|AT|←列
1|1|2|34|56|・・・・|X |Y |Z |
2| | |  |  |・・・・|  |  |  |
↑         ・
行         ・
          ・

この様にしたいのです。

Arrayを使い自力でやってはみたのですがArrayは
項目数の制限があるらしく「コンパイルエラー、
メモリーが不足しています。」となってしまいます。
VBA初心者なので他の方法がわかりません。
Arrayを使わずにできる方法がありましたら
教えてください。お願いします。
ちなみにExcel97を使用しています。
 ───────────────────────────────────────  ■題名 : Re:Array以外の方法を教えてください。  ■名前 : Nakamura  ■日付 : 02/10/2(水) 12:58  -------------------------------------------------------------------------
   ▼デヤン さん:

こんにちは

>例え
>テキストファイルに以下のデータが入っているとします。
>
>テキストファイルのデータ:123456・・・XYZ
>                  ・
>                  ・
>                  ・
>
>コマンドボタンを押し、テキストファイルを読み込むと
>
>_|A|B| C| D|・・・・|AR|AS|AT|←列
>1|1|2|34|56|・・・・|X |Y |Z |
>2| | |  |  |・・・・|  |  |  |
>↑         ・
>行         ・
>          ・
>
>この様にしたいのです。

これだけでは、レスの付けようがないです。
セルに振り分ける法則性も解りませんし・・
もう少し、詳しく書いた上で、デヤン さんの考えた
コードもアップすればレスが付き易い思います。

>テキストファイルのデータ:123456・・・XYZ

これが、スペースもカンマもない連続した文字列?なら
これを 文字列形式の変数に格納して、Right、Left、Midなどの文字列操作関数を
使って、セルに振り分けるというのはどうでしょう?

それでは
 ───────────────────────────────────────  ■題名 : Re:Array以外の方法を教えてください。  ■名前 : デヤン  ■日付 : 02/10/2(水) 14:11  -------------------------------------------------------------------------
   ▼Nakamura さん:
>▼デヤン さん:
>
>こんにちは

nakamuraさん、こんにちわ。

>これだけでは、レスの付けようがないです。
>セルに振り分ける法則性も解りませんし・・
>もう少し、詳しく書いた上で、デヤン さんの考えた
>コードもアップすればレスが付き易い思います。
>

すいません。簡単に書きすぎました。
コードは以下の通りです。ただ、文字列を振り分けてるだけの
ものですが・・・。
Private Sub CommandButton1_Click()
  Workbooks.OpenText FileName:="C:\WINDOWS\デスクトップ\VBA\test.txt", _
  StartRow :=11, DataType:=xlFixedWidth, FieldInfo:= _
  Array(Array(0, 2), Array(1, 1), Array(2, 1), Array(11, 1), _
  Array(12, 1), Array(33, 1), Array(34, 1), Array(36, 1), _
  Array(37, 1), Array(39, 1), Array(40, 1), Array(42, 1), _
  Array(43, 1), Array(45, 1), Array(46, 1), Array(48, 1), _
  Array(49, 1), Array(51, 1), Array(52, 1), Array(54, 1), _
  Array(55, 1), Array(57, 1), Array(58, 1), Array(60, 1), _
  Array(61, 1), Array(63, 1), Array(64, 1), Array(66, 1), _
  Array(67, 1), Array(69, 1), Array(70, 1), Array(72, 1), _
  Array(73, 1), Array(75, 1), Array(76, 1), Array(78, 1), _
  Array(79, 1), Array(81, 1), Array(82, 1), Array(84, 1), _
  Array(85, 1), Array(87, 1), Array(88, 1), Array(90, 1), _
  Array(91, 1), Array(93, 1), Array(94, 1), Array(96, 1), _
  Array(97, 1), Array(99, 1), Array(100, 1), Array(102, 1), _
  Array(103, 1), Array(105, 1), Array(106, 1), Array(108, 1), _
  Array(109, 1), Array(111, 1), Array(112, 1), Array(114, 1), _
  Array(115, 1), Array(117, 1), Array(118, 1), Array(120, 1), _
  Array(121, 1), Array(123, 1), Array(124, 1), Array(126, 1), _
  Array(127, 1), Array(129, 1), Array(130, 1), Array(132, 1))
End Sub

>>テキストファイルのデータ:123456・・・XYZ
>
>これが、スペースもカンマもない連続した文字列?なら
>これを 文字列形式の変数に格納して、Right、Left、Midなどの文字列操作関数を
>使って、セルに振り分けるというのはどうでしょう?
>
>それでは

そうです。スペースもカンマもない文字列です。
文字列操作関数ですか。具体的にどのように書けばいいのですか?
初心者丸だしですいません。
 ───────────────────────────────────────  ■題名 : Re:Array以外の方法を教えてください。  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/10/2(水) 20:26  -------------------------------------------------------------------------
   横から失礼しますが
以前に作った物が使えそうなので少し長くなりますがUpします

Openステートメントを使った読み込みです
TextファイルのCrLfまでを一行として読み込みます
また、フィールド長の設定は、
"設定"と言うシートを作成し、そのセルに、列見出し、
フィールド長、セル書式を記入します
その方法は、
"設定"シートのB1からC1、D1・・に、列見出しを記入
(記入しなければ、表示されないだけ)
B2からC2、D2、・・と、フィールドの長さをバイト単位(全角2バイト、半角1バイト)
の整数で記入
B3、C3、D3・・と読み込むセルの書式を記入
(""が何もしない、1が標準、2が文字列、3がyyyy/mm/ddの日付)
数値を文字列として読み込むような場合以外は設定しない方が早いと思います
Sub CommandButton1でコメントアウトの様にすれば、A1からデータを書き込むと思います

Private Sub CommandButton1_Click()

  Dim intCalc As Integer
  Dim sinTime1 As Single
  Dim sinTime2 As Single
  
  sinTime1 = Timer
  
  
  With Application
    '画面更新を停止
    .ScreenUpdating = False
    '再計算の方法を保存
    intCalc = .Calculation
    '再計算を手動へ
    .Calculation = xlCalculationManual
  End With
  
  SDFReadTextADV "C:\WINDOWS\デスクトップ\VBA\test.txt", 2
  'SDFReadTextADV "C:\WINDOWS\デスクトップ\VBA\test.txt", 1
  
  With Application
    '再計算の仕方を元に戻す
    .Calculation = intCalc
    '再計算を実行
    .Calculate
    '画面更新を再開
    .ScreenUpdating = True
  End With
    
  sinTime2 = Timer
  Worksheets("設定").Range("D20").Value = sinTime2 - sinTime1
  
  Cells.EntireColumn.AutoFit
  Cells(1, 1).Select
  
  Beep
  MsgBox "処理が終了しました", vbOKOnly, "終了"

End Sub

以下を同じ標準モジュールへ記入

Option Explicit

Public Sub SDFReadText(strFileName As String, _
              Optional lngListRow As Long = 2)

  Dim i As Long
  Dim dfn As Integer
  Dim vntField As Variant
  Dim intFieldMax As Integer
  Dim strLine As String
  Dim vntDatas As Variant
  Dim lngRecLeng As Long
  Dim lngLineMax As Long
    
  '設定シートからフィールド長等を読み込み、列見出しを書き込む
  GetFieldAttribute vntField
  intFieldMax = UBound(vntField, 2)
  If lngListRow > 1 Then
    PutFieldNames lngListRow - 1, lngListRow - 1
  End If
  For i = 1 To intFieldMax
    lngRecLeng = lngRecLeng + CLng(vntField(1, i))
  Next i
  lngRecLeng = lngRecLeng + 2
  lngLineMax = FileLen(strFileName) \ lngRecLeng
  For i = 1 To intFieldMax
    CellsForm Range(Cells(lngListRow, i), Cells(lngListRow + lngLineMax, i)), vntField(2, i)
  Next i
  
  dfn = FreeFile
  Open strFileName For Input As dfn
  
  ReDim vntDatas(1 To 1, 1 To intFieldMax)
  Do Until EOF(dfn)
    Line Input #dfn, strLine
    vntDatas = DivideStr(strLine, vntField)
    Range(Cells(lngListRow, 1), _
          Cells(lngListRow, intFieldMax)).Value = vntDatas
    'シートの書き込み行を1つ更新
    lngListRow = lngListRow + 1
  Loop
  
  'ファイルを閉じる
  Close dfn
  
End Sub

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

  Dim i As Long
  Dim lngPos As Long
  Dim vntData As Variant
  Dim intDataMax As Integer
  
  'Unicodeからシステムの既定のコード ページに変換します
  strLine = StrConv(strLine, vbFromUnicode)

  lngPos = 1
  intDataMax = UBound(vntLength, 2)
  ReDim vntData(1 To 1, 1 To intDataMax)
  For i = 1 To intDataMax
    vntData(1, i) = Trim(StrConv(MidB(strLine, lngPos, CLng(vntLength(1, i))), vbUnicode))
    lngPos = lngPos + CLng(vntLength(1, i))
  Next i
  
  DivideStr = vntData
  
End Function

Private Sub GetFieldAttribute(vntField As Variant)

'  設定Field長、変換方法の読み込み

  Dim lngColEnd As Long
  
  With ThisWorkbook.Worksheets("設定")
    lngColEnd = .Cells(2, 256).End(xlToLeft).Column
    vntField = .Range(.Cells(2, 2), .Cells(3, lngColEnd)).Value
  End With
  
End Sub

Private Sub CellsForm(rngLocate As Range, vntFormNo As Variant)

'  セルの設定(必要な場合、Dataの加工)

  With rngLocate
    Select Case vntFormNo
      Case 1
        .NumberFormatLocal = "G/標準"
      Case 2
        .NumberFormatLocal = "@"
      Case 3
        .NumberFormatLocal = "yyyy/mm/dd"
    End Select
  End With

End Sub

Private Sub PutFieldNames(lngRow As Long, lngCol As Long)

'  列見出しの書きこみ

  Dim lngColEnd As Long
  Dim vntTmp As Variant
  
  With ThisWorkbook.Worksheets("設定")
    lngColEnd = .Cells(1, 256).End(xlToLeft).Column
    vntTmp = .Range(.Cells(1, 2), .Cells(1, lngColEnd)).Value
  End With
  With Range(Cells(lngRow, lngCol), Cells(lngRow, lngColEnd - 1))
    .Value = vntTmp
    .Interior.ColorIndex = 34
  End With
  
End Sub
 ───────────────────────────────────────  ■題名 : Re:Array以外の方法を教えてください。  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/10/2(水) 21:11  -------------------------------------------------------------------------
   あ!書き忘れました
このコードは、アクティブシートにデータを書き込んで行きます
"設定"シートや他のシートがアクティブに成っている時に実行すると、
書き換えてしまうので気をつけて下さい
OpenTextの様に新しいBookに書きこまれる訳では有りません
また、読み込む速度は速い方では有りません、というより遅い方です

"設定"シートの書き方はこんな感じ
   A    B   C    D    E
1      旧番号 新番号 府県名 町村名
2  Field長  6    6    8    30
3  書式   2    2
 ───────────────────────────────────────  ■題名 : Re:Array以外の方法を教えてください。  ■名前 : デヤン  ■日付 : 02/10/3(木) 10:06  -------------------------------------------------------------------------
   Hirofumiさん、おはようございます。

おかげさまで、なんとかできるように
なりました。ありがとうございます。
 ───────────────────────────────────────  ■題名 : Re:Array以外の方法を教えてください。  ■名前 : Hirofumi <hirofumi@venus.dti.ne.jp>  ■日付 : 02/10/3(木) 19:36  -------------------------------------------------------------------------
   コードに間違えが有りました
Sub SDFReadTextの以下の部分を修正してください

現状
  If lngListRow > 1 Then
    PutFieldNames lngListRow - 1, lngListRow - 1
  End If

修正
  If lngListRow > 1 Then
    PutFieldNames lngListRow - 1, 1
  End If
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 159