dポイントプレゼントキャンペーン実施中!

VBAを4月から習おうと講座に申込んだり準備をしていたところ
それを聞いた上司が前勉強でツールを作れ、と無茶ぶりしてきました。しかも期限がすごく短くて焦ってます。
まだ勉強前で右も左もわからないので、本を読んだりWEBで調べたりしたのですが、
どうしてもよく作れない部分があります。教えてください。

うまくいかない部分
社内システムに投入するテキストファイルを作成したいです。
①作成ボタンを押したら投入する文章の書かれたテキストdefault.txtを呼び出す
②そのテキスト内の決まった項目(C1、C2,C3)をそれぞれActiveSheetのA1、A2、A3
に置換する
③shinki.txtという名前で書きだす

スクリプト?ランタイムを使うといいと聞きましたが、よくわかりません。

Private Sub SakuseiButton_Click()
  References.AddFromFile "C:\Windows\system32\scrrun.dll"

  Call ReplaceFromFile("C:\default.txt", "C1", "A1")
   Call ReplaceFromFile("C:\default.txt", "C2", "A2")
  Call ReplaceFromFile("C:\default.txt", "C3", "A3")
   Call ReplaceFromFile("C:\shinki.txt", vbCrLf)
End Sub

すみません、上のをどう直せばいいのでしょう?
周りはVBAのツールを使ったことはあっても作ったことのある人はいません…
助けてください!

A 回答 (3件)

私のように、下手くそなVBAなど書いて人に教えないほうがよいのかもしれませんが、ちょっと興味を持ちました。



その「scrrun.dll」の方法から組み立てるというのは難しいですね。

私自身も、Microsoft Office を教わりにいって、VBAもやりたいと言ったら、そこの講師の先生から、FOM(富士通の緑のテキスト)の本だけで、その日に合計を出すプログラムを作りなさい、という宿題だけで、これも無茶ぶりでした。それに、家にはパソコンがないから、紙の上でシミュレート(^^; でも、それでVBAの授業は終わりでした。たった1日の授業でした。

>References.AddFromFile
これって、参照設定を呼び出す方法ですが、Excel VBAでは一生使わないと思います。Accessの単体化させるときに、使うぐらいではないかと思います。

scrrun.dll  →Scripting Runtime → FileSystemObject
です。

それと、
https://www.moug.net/tech/acvba/0090005.html
Access VBAをご覧になったかとは思うのですが、

>Call ReplaceFromFile("C:\default.txt", "C1", "A1")
VBAやVBというのは、本来、こうした関数型プログラムではありませんから、このようには書かないほうがよいでしょう。Access の場合は、もともとが、関数型で書くようなスタイルになっているので、このようなスタイルにならざるを得ないのです。

以下のマクロは、ファイルの取り扱いの制限があったと思います。理論上は、2G 程度までですが、その10分の1ぐらいが安全で使える限度かもしれません。

Range("C1", Cells(Rows.Count, 3).End(xlUp))
は、C1 からずっと間を入れずにデータを入れます。C列が検索値で、A列が置換値です。同じ行のA列を参照しています。

FName = ThisWorkbook.Path & "\" & "Default.txt"

ThisWorkbook.Path は、実体がないファイル(保存前)では、取れません。一旦、マクロ入りブックを保存し、そのブックと同じフォルダの中のテキストファイルを探すように出来ています。

.CreateTextFile(NewFile, True, True) 'File名, True=上書きOK, True/False=Unicode/s_jis

'//--------

Option Explicit
Sub TestMacro1() '←ボタンに変えてください。
  Dim FName As String
  Dim NewFile As String
  Dim myAllTxt As Variant
  Dim Fn As String
  Dim c As Range
  FName = ThisWorkbook.Path & "\" & "Default.txt"
  NewFile = ThisWorkbook.Path & "\" & "Shinki.txt"
  If Dir(FName) = "" Then
    MsgBox "ファイルがありません。", vbExclamation
    Exit Sub
  End If
  With CreateObject("Scripting.FileSystemObject")
    With .GetFile(FName).OpenAsTextStream
      myAllTxt = .ReadAll
      .Close
    End With
    For Each c In Range("C1", Cells(Rows.Count, 3).End(xlUp))
      If Trim(c.Value) <> "" Then
        myAllTxt = Replace(myAllTxt, c.Value, c.Offset(, -2).Value)
      End If
    Next c
    If Dir(NewFile) <> "" Then
      Kill NewFile
    End If
    With .CreateTextFile(NewFile, True, True) 'True=上書きOK
      Fn = Dir(NewFile)
      If Fn = "" Then
        MsgBox "新規ファイル作成に失敗しました。", vbCritical
        Exit Sub
      End If
      .Write myAllTxt
      .Close
    End With
  End With
  Beep
End Sub

'//
仕事では、できるかぎり、VBAはしないほうがよいかと思います。変な期待されても、できるものではありませんから。私だけかもしれませんが。
    • good
    • 0

>References.AddFromFile "C:\Windows\system32\scrrun.dll"


使いたいのはわかりますが、VBAレベルではかなり上級ですよね。
これからVBA講座を受けられても、この内容までは出てこないと思います。
一案ですが
default.txt が固定した内容であれば
新しいシートのコピーしておく。
C1,C2,C3の部分をActiveSheetのA1、A2、A3に置き換えるマクロを考える。
置き換えたシートをTxtの形式で保存してみて
ご希望のシートにならないか試してみる。
これで良ければ、ほとんどがマクロの記録で出来ると思います。
もし、default.txtが時に変更があり場合は別途
default.txtのシートへの貼付けのボタンを別途準備するなどが
考えられます。
講座のなかでも、初歩の部分で出来ると思います。
    • good
    • 0

操作は以下のようになります。


default.txtをエクセルで開き、ワークシートに並べる
(C1, C2, C3)を別シートの(A1, A2, A3)に置換する。
ファイルを保存し閉じる

default.txtを開く際に、区切り文字を指定する必要があります。例えばCSVファイルならカンマ「,」です。スペースとかタブとかあります。ここではカンマにします。置換したいデータのあるシートをアクティブにした状態でマクロ起動して下さい。

Sub myReplace()

Dim ws As Worksheet
Set ws = ActiveSheet
Workbooks.OpenText Filename:=ThisWorkbook.Path & "\default.txt", comma:=True
Cells(1, "C").Value = ws.Cells(1, "A").Value
Cells(2, "C").Value = ws.Cells(2, "A").Value
Cells(3, "C").Value = ws.Cells(3, "A").Value
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\default.txt", FileFormat:=xlCSV
ActiveWorkbook.close savechanges:=False
Application.DisplayAlerts = True

End Sub

期限があるから急ぐ気持ちは分りますが、内容理解して下さいね。マクロは配布した後が忙しくなるのです。
    • good
    • 0

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