![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
以下のスクリプトについて教えてください。
setで代入したことろはセルの内容がしっかり反映されていたのですが、
=になってからは、書き出されたテキストファイルに不備が出ました。
ググってみたところ、オブジェクト型(セルをまるごとなど)にはsetを使わないとダメとのことでした。
そこで、下記のスクリプトの
IntFlNo = FreeFile
Open StrFN For Output As #IntFlNo
s = Replace(Worksheets("Sheet2").Range("A171").Text, "<br />", vbCrLf)
Print #IntFlNo, s
s = Replace(Worksheets("Sheet2").Range("B171").Text, "<br />", vbCrLf)
Print #IntFlNo, s
Close #IntFlNo
の部分で、
sの変数を使っている箇所を
setで表現したスクリプトを教えてください。
====================================================
Sub Test()
Range("E3").CurrentRegion.Select
Selection.Replace What:="" & Chr(10) & "", Replacement:="<br />", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Application.Wait Now + TimeValue("00:00:01")
Dim s As String, IntFlNo As Integer
Dim StrFN As String, myObj As Object
Set myObj = CreateObject("WScript.Shell")
StrFN = myObj.SpecialFolders("Desktop")
Set myObj = Nothing
StrFN = StrFN & "\d.txt"
IntFlNo = FreeFile
Open StrFN For Output As #IntFlNo
s = Replace(Worksheets("Sheet2").Range("A171").Text, "<br />", vbCrLf)
Print #IntFlNo, s
s = Replace(Worksheets("Sheet2").Range("B171").Text, "<br />", vbCrLf)
Print #IntFlNo, s
Close #IntFlNo
End Sub
No.2ベストアンサー
- 回答日時:
#1、cjです。
補足欄へのレスです。> Range("A171")、Range("B171")には、CONCATENATE、char10()、など色々なセルの値がミックスされた
> データが入っております。
これは、#1で私が指摘したセル参照の間違いは、ない、ということだと思います。
> 一応この記述で実行すると、Range("A171")、Range("B171")の順番でテキストファイルに出力されます。
これは、アクセスモード[Output]のままで、構わない、ということだと思います。
> =を使った理由は、<br />を改行に置換したかったからです。
これは、現状の問題点は、「<br />を改行に置換できない」という一点に絞られている、ということだと思います。
> もし、setを使って改行に置換できるのであれば、
> 以下の構文を使って、<br />を改行に置換できる方法を教えていただきたいです。
ご提示のマクロは何れも、
セル範囲のデータ(文字列値)を元に、
文字列(整形)処理「<br />を改行に置換」をした文字列データを
テキストファイルに出力する、
という内容なっています。
そちらで、多少の誤解があるように思いますが、
当初のご質問本文にて提示されたコードの中で、
s = Replace(Worksheets("Sheet2").Range("A171").Text, "<br />", vbCrLf)
s = Replace(Worksheets("Sheet2").Range("B171").Text, "<br />", vbCrLf)
これら2箇所の記述によって、"<br />" は、vbCrLf に正しく置換されて
文字列型変数に格納されています。
また、実際に出力されたテキストファイルの内容についても、
正しく置換されていることを確認した上で回答に至っています。
「<br />を改行に置換できない」という点が、まず、理解しづらいのです。
次に、扱うデータは文字列型ですから、
通常、オブジェクト型変数にオブイジェクトアクセスを設定する為に使う
Set ステートメントを使う必要性は全くありません。
なので、
> setを使って改行
というお望みには答えようがないのです。
強いて応えるなら、以下のような感じでしょうか?
' ' ===================================
Sub ReMacro25()
Range("E3").CurrentRegion.Select
Selection.Replace What:="" & Chr(10) & "", Replacement:="<br />", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Application.Wait Now + TimeValue("00:00:01")
Dim myObj As Object
Dim ranData As Range
Dim StrFN As String
Dim s As String
Dim IntFlNo As Integer
Set myObj = CreateObject("WScript.Shell")
StrFN = myObj.SpecialFolders("Desktop")
Set myObj = Nothing
StrFN = StrFN & "\d.txt"
Set ranData = Worksheets("Sheet2").Range("A171")
s = ranData.Value
Set ranData = Worksheets("Sheet2").Range("B171")
s = s & vbCrLf & ranData.Value
Set ranData = Nothing
s = Replace(s, "<br />", vbCrLf)
IntFlNo = FreeFile
Open StrFN For Output As #IntFlNo
Print #IntFlNo, ranData.Value
Close #IntFlNo
End Sub
' ' ===================================
勿論、これも動作確認済ですが、処理の内容には変わりありません。
Set ステートメントと文字列の置換には関係ないからです。
ただ、
「<br />をvbCrLfに置換」出来ていても
例えば
「<br/>をvbCrLfに置換」するようには書けていませんから、
この半角スペースひとつの違いであっても
s = Replace(s, "<br/>", vbCrLf)
と、追記する必要が出てくる場合もあるでしょう。
或いは、
「<br />と<br/>を同時にvbCrLfに置換」したい、
ということでしたらば、それは、
正規表現(RegExp)オブジェクトを用いて実現することになりますが、
今回のご質問では、そこまではお求めでないと考えています。
ご提示のマクロの冒頭4行が、処理にどのように関連しているか、最初は判らなかったのですが、
Worksheets("Sheet2").Range("A171")またはWorksheets("Sheet2").Range("B171")のセルに設定された数式が
Range("E3").CurrentRegionのセルを参照していて、
Range("E3").CurrentRegionにて「Chr(10)つまりvbLf を "<br />" に置換」した結果を
Worksheets("Sheet2").Range("A171")またはWorksheets("Sheet2").Range("B171")のセルに設定された数式にも
反映させたい、ということでしょうか。
それでしたら、
Application.Wait Now + TimeValue("00:00:01")
の代りに
Worksheets("Sheet2").Range("A171:B171").Calculate
と記述すれば、
処理の確度を高めることができます。
もうひとつの可能性として、
Worksheets("Sheet2").Range("A171")またはWorksheets("Sheet2").Range("B171")のセルに設定された数式の中に
CHAR(10)が使われているのであれば、これが、思わぬ結果の原因である可能性は高いです。
改行文字を統一しなければ、正しく出力されないことはありますので。
その場合は。改行を一旦、vbLf(CHAR(10)) に統一しておいてから、最後に vbCrLf に統一するようにします。
それと、これは求められてもいない余計なことかも知れませんが、
参照先のセル値にの一部に、<br />に続けてセル内改行(CHAR(10))が並んでいる場合、
普通は、これをひとつの改行と看做す必要があります。
これらのポイントを踏まえて当初ご提示のコードを書き換えると以下のようになります。
' ' ===================================
Sub Test9()
' ' 冒頭4行不要
Dim s As String, IntFlNo As Integer
Dim StrFN As String, myObj As Object
Set myObj = CreateObject("WScript.Shell")
StrFN = myObj.SpecialFolders("Desktop")
Set myObj = Nothing
StrFN = StrFN & "\d.txt"
IntFlNo = FreeFile
Open StrFN For Output As #IntFlNo
s = Replace(Worksheets("Sheet2").Range("A171").Text, "<br />" & vbLf, vbLf)
s = Replace(s, "<br />", vbLf)
s = Replace(s, vbLf, vbCrLf)
Print #IntFlNo, s
s = Replace(Worksheets("Sheet2").Range("B171").Text, "<br />" & vbLf, vbLf)
s = Replace(s, "<br />", vbLf)
s = Replace(s, vbLf, vbCrLf)
Print #IntFlNo, s
Close #IntFlNo
End Sub
' ' ===================================
繰り返しになりますが、こちらでは実際にサンプルを複数作成して、
動作を確認しています。
元のコードから一部、文字列の置換処理を書き換えた程度ですが、
どうでしょう、改行は正しく反映されていませんか?
大変でしょうけれど、検証、頑張ってください。
ありがとうございます。
本当に詳しく教えていただき、心から御礼申し上げます。
上の方の式で検証してみましたところ、
下から3行目のPrint #IntFlNo, ranData.Valueでエラーがでたたえめ、
Print #IntFlNo, s に書き換えました。
そうしたらテキストファイルでしっかり改行されたものが出力されました!
以前は途中でデータが途切れたりしていたので、
これで安心して業務に取り掛かれます。
この度は本当にありがとうございました。
Range("E3").CurrentRegion.Select
Selection.Replace What:="" & Chr(10) & "", Replacement:="<br />", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Application.Wait Now + TimeValue("00:00:01")
Dim myObj As Object
Dim ranData As Range
Dim StrFN As String
Dim s As String
Dim IntFlNo As Integer
Set myObj = CreateObject("WScript.Shell")
StrFN = myObj.SpecialFolders("Desktop")
Set myObj = Nothing
StrFN = StrFN & "\d.txt"
Set ranData = Worksheets("Sheet2").Range("A171")
s = ranData.Value
Set ranData = Worksheets("Sheet2").Range("B171")
s = s & vbCrLf & ranData.Value
Set ranData = Nothing
s = Replace(s, "<br />", vbCrLf)
IntFlNo = FreeFile
Open StrFN For Output As #IntFlNo
Print #IntFlNo, s
Close #IntFlNo
No.3
- 回答日時:
#1、2、cjです。
失礼しました。色々書いている内に、掲載するべきものを選択ミスしてしまったようです。
ご指摘の通り、
Print #IntFlNo, ranData.Value
は、誤りで、
Print #IntFlNo, s
が、実際にテストしていた内容で、こちらが意図したものです。
すみません。
No.1
- 回答日時:
こんにちは。
結論から言うと、ご提示のコードに文法上の誤りはありません。
> sの変数を使っている箇所を
> setで表現したスクリプトを教えてください。
と仰っている部分では、Object型やオブジェクトを扱う変数などは
扱われていませんので、set は使いようがありません。
ご提示のコードでオブジェクト型というと、
myObj As Object が唯一該当しますが、
この変数とオブジェクトの扱いにもまったく問題ありません。
> 書き出されたテキストファイルに不備が出ました。
残る問題は、
「何がしたくて」
「求める結果」
と「どう違うか」
ということになると思います。
まずは、この点を、ご自身で言葉にして整理することから始めてみてください。
ご提示のコードについては、
その目的や条件によっては、間違いのない正しい記述なのです。
差し当たり、ありがちな例を挙げておくと、
「テキストの追加書き出しをしたい」
なのに、
「出力済のテキストの次に追加出力される」
つもりが
「上書きされてしまって以前に保存したテキストが消えてしまう」
というようなことでしたらば、
Open StrFN For Output As #IntFlNo
のアクセスモード[Output]が不適切です。
もし、そういうことでしたらば、
アクセスモード[Append]について調べて、
追加書き出しが出来るようにすれば解決すると思います。
特に解説は添えませんが質問者さんなら、できると思います。
他に、どんな問題があるか、想像ですが、
出力の前処理としてのテキストの整形がうまくいっていないのかもしれません。
これについては、
プロシージャの実行をF8キー(ステップイン)で一行ずつ、
イミディエイトウィンドウに
? s
とタイプしてそのままEnterすれば、文字列型変数 s の内容が確認できますから、
どこに間違いがあるか探してみてください。
Excel VBA に不慣れで、Excel には慣れ切っている人にありがちなミスとして、
.Range("A171")
のような記述が、適切な参照になっているのか、一応、確認してみてください。
例えば、
Excel数式では、「=C3」という数式を設定した後で、
2行めを削除した場合は「=C2」
B列を削除した場合は「=B3」
のように自動的に参照先を書き換えてくれる機能が備わっていますが、
VBAには、そのようなお節介な機能はありません。
手動であれVBAの処理によるものであれ、セル範囲の削除をするようであれば、
それに合わせて書き方を替えていかないとなりません。
とりあえず、確率の高そうな点に限り指摘してみました。
これ以外のケースについては、そちらで情報を整理してから
補足欄にでも書いてみてください。
この回答への補足
Range("A171")、Range("B171")には、CONCATENATE、char10()、など色々なセルの値がミックスされた
データが入っております。
一応この記述で実行すると、Range("A171")、Range("B171")の順番でテキストファイルに出力されます。
=を使った理由は、<br />を改行に置換したかったからです。
もし、setを使って改行に置換できるのであれば、
以下の構文を使って、<br />を改行に置換できる方法を教えていただきたいです。
====================================================
Sub Macro25()
Range("E3").CurrentRegion.Select
Selection.Replace What:="" & Chr(10) & "", Replacement:="<br />", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False
Application.Wait Now + TimeValue("00:00:01")
Dim ranData As Range, IntFlNo As Integer
Dim StrFN As String, myObj As Object
Set myObj = CreateObject("WScript.Shell")
StrFN = myObj.SpecialFolders("Desktop")
Set myObj = Nothing
StrFN = StrFN & "\d.txt"
Set ranData = Worksheets("Sheet2").Range("A171")
IntFlNo = FreeFile
Open StrFN For Output As #IntFlNo
Print #IntFlNo, ranData.Value
Set ranData = Worksheets("Sheet2").Range("B171")
Print #IntFlNo, ranData.Value
Close #IntFlNo
End Sub
====================================================
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excel VBA メール作成について 本文の中にExcel でコピーした図を上下に2つ 貼り付けを 2 2023/06/14 01:48
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/03 09:11
- Visual Basic(VBA) Excel vbaについての質問 3 2023/04/18 16:14
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで文字の入力がセルの...
-
多数の計算セルに一括で同一の...
-
excelで可視セルのみ置換
-
Excelの空文字セルの削除方法を...
-
【エクセル】ピボットテーブル...
-
Excelからテキストへのコ...
-
エクセルでセル内の一部を一括...
-
Excelの入力済みセルに一括で、...
-
エクセルのセルの中の,よりも前...
-
Excelで、半角スペースをTABに...
-
エクセルの表ををメモ帳などに...
-
excelからメモ帳への貼り付け
-
置換機能を使わずに先頭に「'」...
-
Excelで特定の文字の前だけに空...
-
Excelで電話番号などの-(ハイ...
-
別シートのリストから置換する方法
-
企業名簿で(株)や(有)を無視し...
-
エクセルでセル内の一部分だけ...
-
Excelのmatch関数エラー原因が...
-
EXCEL 縦の式を横にコピー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
多数の計算セルに一括で同一の...
-
エクセルで文字の入力がセルの...
-
エクセルのセルの中の,よりも前...
-
Excelからテキストへのコ...
-
excelで可視セルのみ置換
-
Excelの入力済みセルに一括で、...
-
Excelのmatch関数エラー原因が...
-
Excelで、半角スペースをTABに...
-
Excelの空文字セルの削除方法を...
-
【エクセル】ピボットテーブル...
-
置換機能を使わずに先頭に「'」...
-
企業名簿で(株)や(有)を無視し...
-
小数点を消す方法
-
エクセルの表ををメモ帳などに...
-
エクセルでセル内の一部分だけ...
-
Excelのシートにある1行...
-
エクセルでセル内の一部を一括...
-
Excelで特定の文字の前だけに空...
-
エクセルの関数で、記号などを...
-
別シートのリストから置換する方法
おすすめ情報