[[20171106120300]] 『エクセルを開かず一定の文字列や値を更新』(じゅじゅ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『エクセルを開かず一定の文字列や値を更新』(じゅじゅ)

エクセルを開かず一行目の項目を指定したら
その列全てに文字列や値を入れて最後に
何件更新しましたと結果も分かるマクロコード
があればいいなあと思っております。

開いてから更新して保存するまでが、情報量が多いcsvを
待つ時間がもったいなくて。。

イメージですが、
code price sp-additional
という項目が一行目に入っているcsvに対して
sp-additional
の列に文字列や値を入れる場合、

1.更新したいcsvファイルを選択
2.msgboxなどで対象の項目を入力する(sp-additionalなど)
3.msgboxなどで更新したい値や文字列などを入力
4.例えば、1000列あるcsvだとしたら1000件成功しましたと出れば分かりやすいので
 コメントが最後に出る。
5.名前を付けて保存したいので保存画面が開く

という素人の考えた流れですが、他の方がマクロが書きやすい場合は
そちらでも構いません。

質問に対して不足していることがあるかもしれませんが、宜しくお願い致します。

< 使用 Excel:Excel2016、使用 OS:Windows10 >


[[20171009154313]] 『VBA 同じ作業を自動化』(サク)
 の応用

 Sub test()
    Dim fn As String, txt As String, myValue, n As Long, Dest As String
    Dim x, y, myCode As String, myIndex, i As Long
    fn = Application.GetOpenFilename("CSVFiles,*.csv")
    If fn = "False" Then Exit Sub
    myCode = InputBox("条件項目名の入力", , "sp-additional")
    If myCode = "" Then Exit Sub
    x = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll, vbNewLine)
    myIndex = GetCodeIndex(x, myCode, ",")
    If IsError(myIndex) Then
        MsgBox "[" & myCode & "] は有効な項目ではありません。", 16
        Exit Sub
    End If
    MsgBox myCode & " は " & myIndex(0) + 1 & " 列目になります"
    myValue = InputBox("値の入力")
    For i = 0 To UBound(x)
        If x(i) <> "" Then
            y = Split(x(i), ",")
            If i < myIndex(1) Then
                x(i) = vbNullString
            ElseIf i > myIndex(1) Then
                n = n + 1
                If UBound(y) >= myIndex(0) Then y(myIndex(0)) = myValue
            End If
            x(i) = Join(y, ",")
        End If
    Next
    MsgBox n & " 件のレコードを更新"
    Dest = Application.GetSaveAsFilename(fn, "CSVFiles,*.csv")
    If Dest = "" Then Exit Sub
    Open Dest For Output As #1
        Print #1, Join(x, vbNewLine)
    Close #1
 End Sub

 Function GetCodeIndex(x, myCode As String, delim As String)
     Dim i As Long, ii As Long, y, flg As Boolean
     Dim rowInd As Long, ColInd As Long
     For i = 0 To UBound(x)
         If x(i) <> "" Then
             y = Split(x(i), delim)
             For ii = 0 To UBound(y)
                 If LCase$(y(ii)) = LCase$(myCode) Then
                     rowInd = i: ColInd = ii: flg = True: Exit For
                 End If
             Next
         End If
         If flg Then Exit For
     Next
     If flg Then
         GetCodeIndex = Array(ColInd, rowInd)
     Else
         GetCodeIndex = CVErr(2042)
     End If
 End Function
(seiya) 2017/11/06(月) 13:11

早速の回答誠にありがとうございます。

新規を開いてシート1でマクロを実行してみたところ、

Function GetCodeIndex(x, myCode As String, delim As String
の名前が適切ではありません:GetCodeIndex
コンパイルエラー

がでました(><)
(じゅじゅ) 2017/11/06(月) 15:44


すみません、上記のエラーは回避できました。

しかし、更新したい内容で更新されておりませんでした。

1.sp-additionalの左の列には空白もあり、それらのところに値が入ってしまっております。
2.sp-additionalにHTMLタグを入れてみてタグが更新されておりませんでした。

なにか追加でご説明しなければならない項目などございましたらご指導お願い致します。

(じゅじゅ) 2017/11/06(月) 15:56


 元CSVファイルの内容、構成をアップして、更新後にどのような形にしたいのかを
 具体的に説明してください。
(seiya) 2017/11/06(月) 16:03

↓も同じ方でしょうね。csvとExcelブックを区別しない点が共通しています。
[[20171028111301]] 『重たいエクセルファイルを開かずに処理』(kkk)

開くのに30分かかるとか、ちょっと信じがたいですな。

回答者はあなたのPCの画面を見ているわけではないので、
求められたことを説明しなければ、一切前には進みません。

(γ) 2017/11/08(水) 20:43


ご返信が非常に遅くなりまして申し訳ございません。
ご指摘有難うございます。

seiyaさん、
上記のプログラムを他のcsvで列に対して数字やアルファベットを更新してみました。
理由は分かりませんが、4000行あるcsvデータの中で5件

 myValue = InputBox("値の入力")のところで入力した値が入っておらず、他の列にいくつかその値が入っておりました。
プログラムが読み切れないため値が入っていない行になにかしらの共通点があるか見つけられずいまだ苦労しております。

様々なcsvのデータを開かずに更新したいため、
?@作業したいcsvを選択
?A一列目の項目をinputboxで指定
?Bひかかった列に更新したい文字列や数値、htmlなどを更新する

構成に関しましては基本的に一列目に様々な項目があり、
その情報が文字列や数値が入っております。

例えば、
元のcsv↓

name code price sale-price pr-rate spec1 spec2
ジャケット red 【sサイズ】 1234 5000 4000
コート レディース aa1233 6000 5 10|12
手袋 ウール d1234t 10000

のように列ごとに文字や値があるものと空白のものがございます。

こちらの pr-rateをinputboxで探して
見つかったら20という値を最後の行まで更新するとして、

★name code price sale-price pr-rate spec1 spec2
ジャケット red 【sサイズ】 1234 5000 4000 20
コート レディース aa1233 6000 20 10|12
手袋 ウール d1234t 10000 20

となるイメージです。

実験した4000点をここにはると大変ですので、
3行にしてご提示してみました。

※上手くいってない状態としては上記の例ですと
name code price sale-price pr-rate spec1 spec2
ジャケット red 【sサイズ】 1234 5000 4000 20
コート レディース aa1233 6000 20 10|12
手袋 ウール d1234t 10000 20

となり、
pr-rateに空白がある行と
左隣のsele-priceに"20"が入っているものが数点ございました。

他の列に空白があったり全角、記号などがあると上手くいかないのかなぁなど比較してみましたが
なぜ数点だけ値が更新されたのか分かりませんでした。。

回答者様を困らせてしまって申し訳ございません。

説明不足のご指摘も含めご返信よろしくお願い致します。

(じゅじゅ) 2017/12/07(木) 17:32


 ★name	code	price	sale-price	pr-rate	spec1	spec2 
 ジャケット red 【sサイズ】	1234	5000	4000	20	
 コート レディース	aa1233	6000	20	10|12 
 手袋 ウール	d1234t	10000	20

 これでは、元のデータ構成が分りません。
 カンマで区切ったデータ(メモ帳等で開いた状態)を提示してください。	
(seiya) 2017/12/07(木) 19:04

seiyaさん、
csvからメモ帳に貼り付けてからこちらに貼り付けましたが、手順が違いますでしょうか?
申し訳ございません。
(じゅじゅ) 2017/12/07(木) 19:53

name,code,price,sale-price,pr-rate,spec1,spec2 
ジャケット red 【sサイズ】 ,1234,5000,4000,20,,
コート レディース ,aa1233,6000,,20,10|12 ,
手袋 ウール ,d1234t,10000,,20,,

コンマを手動でつけてみました
(じゅじゅ) 2017/12/07(木) 20:07


 csvファイルをエクセルで開かないでメモ帳等のテキストエディタで開く。

 csvファイルを選択して右クリック - プログラムから開く- メモ帳又はワードパッド等で開く。
 それを提示してください。

(seiya) 2017/12/07(木) 20:12


name,code,price,sale-price,pr-rate,spec1,spec2
ジャケット red 【sサイズ】 ,1234,5000,4000,20,,
コート レディース ,aa1233,6000,,20,10|12,
手袋 ウール ,d1234t,10000,,20,,

こちらでいかがでしょう!
(じゅじゅ) 2017/12/07(木) 21:17


 コードを実行して、該当csvファイルを選択
 pr-rateをインプットボックスに入力すると

 pr-rateは5列目になります。 とメッセージが表示され、

 値の入力で20と入力すると...20だと更新したかどうか不明なので
 20を35に変更

 3件のレコードを更新 と表示

 保存先、ファイル名を指定すると生成されたファイルが

 name,code,price,sale-price,pr-rate,spec1,spec2 
 ジャケット red 【sサイズ】 ,1234,5000,4000,35,, 
 コート レディース ,aa1233,6000,,35,10|12, 
 手袋 ウール ,d1234t,10000,,35,, 

 5列目(pr-rate)が35に更新されていますが?

(seiya ) 2017/12/07(木) 21:36

 編集あり 21:46

値の入力が入っていないものを実験してみて気づいた点がございます。
セル内にコンマがある行はうまくいっていなようです。

試しに
name,code,price,sale-price,pr-rate,spec1,spec2
"1,000円off ジャケット red 【sサイズ】 ",1234,5000,4000,20,,
コート レディース ,aa1233,6000,,20,10|12,
手袋 ウール ,d1234t,10000,,20,,

をpr-rate 50で更新してみると

name,code,price,sale-price,pr-rate,spec1,spec2
"1,000円off ジャケット red 【sサイズ】 ",1234,5000,50,20,,
コート レディース ,aa1233,6000,,50,10|12,
手袋 ウール ,d1234t,10000,,50,,

とやはり1,000円のコンマがある行がおかしくなっておりました!
素人の分析ですが、今一度お調べ頂けますと幸いです

(じゅじゅ) 2017/12/08(金) 11:23


 それは影響しますね...

 此方に差し替えてください。

 Sub test()
    Dim fn As String, txt As String, myValue, n As Long, Dest As String
    Dim x, y, myCode As String, myIndex, i As Long
    fn = Application.GetOpenFilename("CSVFiles,*.csv")
    If fn = "False" Then Exit Sub
    myCode = InputBox("条件項目名の入力", , "pr-rate")
    If myCode = "" Then Exit Sub
    x = Split(CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll, vbNewLine)
    myIndex = GetCodeIndex(x, myCode, ",")
    If IsError(myIndex) Then
        MsgBox "[" & myCode & "] は有効な項目ではありません。", 16
        Exit Sub
    End If
    MsgBox myCode & " は " & myIndex(0) + 1 & " 列目になります"
    myValue = InputBox("値の入力")
    For i = 0 To UBound(x)
        If x(i) <> "" Then
            y = Split(CleanCSV(x(i), Chr(2), Chr(3)), ",")
            If i < myIndex(1) Then
                x(i) = vbNullString
            ElseIf i > myIndex(1) Then
                n = n + 1
                If UBound(y) >= myIndex(0) Then y(myIndex(0)) = myValue
            End If
            x(i) = Replace(Replace(Join(y, ","), Chr(2), ","), Chr(3), """")
        End If
    Next
    MsgBox n & " 件のレコードを更新"
    Dest = Application.GetSaveAsFilename(fn, "CSVFiles,*.csv")
    If Dest = "" Then Exit Sub
    Open Dest For Output As #1
        Print #1, Join(x, vbNewLine)
    Close #1
 End Sub

 Function GetCodeIndex(x, myCode As String, delim As String)
     Dim i As Long, ii As Long, y, flg As Boolean
     Dim rowInd As Long, ColInd As Long
     For i = 0 To UBound(x)
         If x(i) <> "" Then
             y = Split(x(i), delim)
             For ii = 0 To UBound(y)
                 If LCase$(y(ii)) = LCase$(myCode) Then
                     rowInd = i: ColInd = ii: flg = True: Exit For
                 End If
             Next
         End If
         If flg Then Exit For
     Next
     If flg Then
         GetCodeIndex = Array(ColInd, rowInd)
     Else
         GetCodeIndex = CVErr(2042)
     End If
 End Function

 Function CleanCSV(ByVal txt As String, ByVal subComma As String, _
     ByVal subDQ As String) As String
     Dim m As Object
     Static RegX As Object
     If RegX Is Nothing Then Set RegX = CreateObject("VBScript.RegExp")
     With RegX
         .Pattern = "(^|,)(""[^""]+"")(,|$)"
         Do While .test(txt)
             Set m = .Execute(txt)(0)
             txt = Application.Replace(txt, m.firstindex + 1, _
             m.Length, m.submatches(0) & Replace(Replace(m.submatches(1), _
             ",", subComma), """", subDQ) & m.submatches(2))
         Loop
     End With
     CleanCSV = txt
 End Function
(seiya) 2017/12/08(金) 11:37

ご迷惑おかけいたしました!
今できないので後ほど試してみます!!
(じゅじゅ) 2017/12/08(金) 12:02

遅くなりました!
コンマの列も値が挿入されておりました!
ご対応頂き誠に有難うございます!
(じゅじゅ) 2017/12/11(月) 10:16

seiyaさん

度々の質問で申し訳ございません。
今回ので更新作業ができて大変助かりました!

上記の流れで値の更新のところを
置換で更新したいのですがご教授お願いできますでしょうか?(><)
(じゅじゅ) 2017/12/12(火) 14:09


 置換とは具体的に何をどのようにしたいのでしょう?
 外出中なので返信は遅くなります。
( seiya) 2017/12/12(火) 14:28

seiyaさん

お忙しい中申しわございません。
前回のはinputboxで更新の値を対象の列に対して更新しましたが、
エクセルの元々ある置換のように
置換前と置換後をinputboxで出るようにして頂きたいです。

どうようにファイルを開かず置換更新が希望です。
置換するのは文字列だったり数字だったりします。
部分置換バージョンという伝え方で大丈夫でしょうか??

可能であれば例えば、
置換前:http://aaaa
置換後:http://bbbb

〇件置換しました!と変更されたセルの数の結果がでると嬉しいです。
(じゅじゅ) 2017/12/12(火) 14:54


 こういうことですか?

 Sub myReplace()
    Dim fn As String, txt As String, strFind As String, strReplace As String, Dest As String
    Dim x, y, myCode As String, myIndex, i As Long
    fn = Application.GetOpenFilename("CSVFiles,*.csv")
    If fn = "False" Then Exit Sub
    strFind = InputBox("検索文字列")
    If strFind = "" Then Exit Sub
    strReplace = InputBox("置換後文字列")
    txt = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll
    Dest = Application.GetSaveAsFilename(fn, "CSVFiles,*.csv", , "保存先")
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "([$()^|\[\]{}*+?.-])"
        strFind = .Replace(strFind, "\$1")
        .Pattern = strFind
        If .test(txt) Then
            Open Dest For Output As #1
                Print #1, .Replace(txt, strReplace)
            Close #1
            MsgBox .Execute(txt).Count & " 件置換"
        Else
            MsgBox "対象文字列無し", , strFind
        End If
    End With
 End Sub
(seiya) 2017/12/12(火) 19:00

seiyaさん

先ほど試してみました。
イメージ通りの処理で感激です!!!

ご丁寧にご回答頂き有難うございました。
(じゅじゅ) 2017/12/13(水) 09:54


seiyaさん
去年は大変お世話になりました!

前回のコードのことでご質問です。

セル内にあるHTMLコードの
http→https
と置換はできましたが、

もっと広い範囲で置換をすると、対象が見つかりませんとでます。
しかし、プログラムではなくもともとある置換を使うと成功致しました。
htmlには記号やスペース、数値や文字列様々入っておりますがそういったことは関係しておりませんでしょうか?
htmlをエクセルで置換するときの注意点などあればご教授頂けると嬉しいです
(じゅじゅ) 2018/01/10(水) 15:05


 今年も頑張りましょう。

 ということでメタ文字(\)の見落とし...

         .Pattern = "([$()^|\[\]{}*+?.-])"
 を
         .Pattern = "([$()^|\[\]{}*+?.\\-])"

 に差し替えてください。
(seiya) 2018/01/10(水) 15:12

seiyaさん

遅くなりまして申し訳ございません。
実験でhtml内の一部を置換してみましたが、
またしてもエクセル上での置換はできましたがプログラムからは
対象の文字が見つかりませんとでました。

メタ文字というのは正直初めてvbaで聞きました。
html内の記号を検索できるようにしていうのでしょうか?

上記のメタ文字に入っていない記号を一応提示しておきます。
< > 半角スペース 全角スペース / " =

これらをメタ文字にいれるのでしょうか??
(じゅじゅ) 2018/01/15(月) 14:22


 ここでいうメタ文字とは正規表現で意味を持つ特殊な文字のことです。

 検索文字列に入力される文字列の例を提示してください。
 此方では、いろいろ試しましたが正しく変換されています。
(seiya) 2018/01/15(月) 15:05

例はこちらになります↓
<a href="https://www.test.ne.jp/test/tenpo/sp/ss/index.html">

修正して頂いてhttp:https:
だと問題なくできましたが<>内まで検索対象を広げると
検索がひっかかりませんでした。

ご教授の方宜しくお願い致します。
(じゅじゅ) 2018/01/15(月) 15:44


 ><>内まで検索対象を広げると
 具体的にどのように検索文字を入力していますか?
(seiya) 2018/01/15(月) 15:56

CSVを開いて置換したい箇所をコピーしてから、
プログラムを実行してIPUTBOXが開いたら貼り付けをしております。

SEIYAさんのほうでは
<a href="https://www.test.ne.jp/test/tenpo/sp/ss/index.html">
を検索ヒットでましたでしょうか?
(じゅじゅ) 2018/01/15(月) 19:20


 はい、ヒットしていますし、変換もされています。

 このようになっていますか?

 Sub myReplace()
    Dim fn As String, txt As String, strFind As String, strReplace As String, Dest As String
    Dim x, y, myCode As String, myIndex, i As Long
    fn = Application.GetOpenFilename("CSVFiles,*.csv")
    If fn = "False" Then Exit Sub
    strFind = InputBox("検索文字列")
    If strFind = "" Then Exit Sub
    strReplace = InputBox("置換後文字列")
    txt = CreateObject("Scripting.FileSystemObject").OpenTextFile(fn).ReadAll
    Dest = Application.GetSaveAsFilename("qqq.csv", "CSVFiles,*.csv", , "保存先")
    With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "([$()^|\[\]{}*+?.\\-])"
        strFind = .Replace(strFind, "\$1")
        .Pattern = strFind
        If .test(txt) Then
            Open Dest For Output As #1
                Print #1, .Replace(txt, strReplace)
            Close #1
            MsgBox .Execute(txt).Count & " 件置換"
        Else
            MsgBox "対象文字列無し", , strFind
        End If
    End With
 End Sub
(seiya) 2018/01/15(月) 19:55

seiyaさん

念のためコードはコピペで上書きしてみました。
テストをもっとシンプルに
<a href="https://www.test.ne.jp/test/tenpo/sp/ss/index.html">
をコピーしてcsvのセルA1〜A3に貼り付けて検索がヒットするか試しましたが
見つかりませんとでてしまいました。

seiyaさんの手順はどのようなやり方でしょうか?
(じゅじゅ) 2018/01/16(火) 09:53


 >csvのセルA1〜A3
 この意味が分かりません。

 csvファイルとエクセルブックは別物です。
 エクセルでもcsvファイルが開けるということだけです。

 元csvファイルをエクセルではなくテキストエディタ(メモ帳等)で開けばわかるはずです。
 (csvファイルを右クリック - プログラムから開く - メモ帳 - で開く)

 コードはcsvファイルをテキストファイルとして読み込んで処理しています。

 私が試しているのは、こんな感じで保存したcsvファイルです。

 <html>
 <head>
 <title>HTML文書の例</title> 
 HTML文書の情報はここに書きます。
 </head>
 <body bgcolor="#0060ff">
 <center>
 <a href="https://www.test.ne.jp/test/tenpo/sp/ss/index.html">
 <h1>簡単なHTML文書の例 </h1></center>
 <hr>
 <a href="https://www.test.ne.jp/test/tenpo/sp/ss/index.html">
 <p>

(seiya) 2018/01/16(火) 10:59


seiyaさん

私がテストしていたcsvは上記のような長文のhtmlだったので、
シンプルに<a href="https://www.test.ne.jp/test/tenpo/sp/ss/index.html">
をcsvのa列に貼ってそれでも検索がでないか試してみましたがでませんでした。

seiyaさんが成功している上記の物をセルに入れてしてみましたがやはり検索ひひっかかりません。。
なぜなのでしょうか(><)
(じゅじゅ) 2018/01/16(火) 11:59


seiyaさん提示のHTMLコードをメモ帳に貼り付け→保存時に拡張子をcsv
にしてみてはどうですか
(通りすがり) 2018/01/16(火) 12:04

 じゅじゅさん

 対象csvをエクセルで開かないでください。
 もしエクセルで開いたら、csvで保存して閉じてからにしてください。
(seiya) 2018/01/16(火) 12:20

csv形式でダウンロードされたものを開いてtest用に修正しただけなのですが、
エクセルとして開くというのはどういうことなのでしょうか?

pcの設定でファイル名にファイル形式が分かるようにしておりますので、
ファイル名はtest.csvというものを開いたり閉じたりしております。

ブックとしてはわざわざ開いていないつもりなのですが。。

すみません知識不足で。
(じゅじゅ) 2018/01/16(火) 12:41


 >csvのセルA1〜A3

 csvファイルにはセルは無いのです。
(seiya) 2018/01/16(火) 12:56

 私の一連の投稿をもう一度よく読んでください。
(seiya) 2018/01/16(火) 13:02

混乱してきました。
この投稿は当初からcsvをダウンロードしたものを
更新や置換をvbaで組んで頂きいくつかのコードは成功しております。

testで作成したa1~a3のものも、testではないものも
どちらもcsv形式でもともとダウンロードしております。

実際にhttp→httpsは成功しており手順も同じです。

すみません、メモ帳が今までは話にでてこなかったもので今までとは違うお話になってきておりますでしょうか??
(じゅじゅ) 2018/01/16(火) 16:13


 ダウンロードした段階ではおそらくExcelで開かれていると思います。
 それに変更を加えたら、csvで上書き保存して閉じてください。
 もし変更を加えないのなら、そのまま閉じてください。

 その後コードを実行して上書き保存したcsvファイルを選択してください。
(seiya) 2018/01/16(火) 16:54

seiyaさん

今一度システムからダウンロードしたcsvを何も触らずに
<a href="https://www.●●●.ne.jp/●●●/●●●/sp/index.html">
●にしたのはリンク先を非公開にしたいためご了承下さい。

を検索窓に入れ、とりあえず置換後は空白にして処理をしましたが
<a href="https://www.●●●.ne.jp/●●●/●●●/sp/index.html">
は見つかりませんとでました。

仮に編集したとしてもいつもそのまま上書き保存をしております。

ちないに、ダウンロードしたcsvファイルを右クリックでメモ帳で開くと
htmlコードの

"が全て""

と二つに増えているのですがこれは気にしなくて大丈夫でしょうか??

<a href=""https://www.●●●.ne.jp/●●●/●●●/sp/index.html"">
となります。

基本的にcsvはエクセルで開くようデフォルト設定しておりまして、エクセルで開くと
"はひとつしかないです。

関係ないようでしたらすみません
(じゅじゅ) 2018/01/18(木) 11:11


 エクセルで開いてcsvで上書き、もしくは名前を変更して保存すると、そのたびに"は増えていきます。
 ダウンロードしたcsvファイルをエクセルで開かないで、最初からメモ帳等で開くことはできませんか?
(seiya) 2018/01/18(木) 12:01

 というか、最初からメモ帳で開けば[置換]で全て解決しませんか?(件数は出ませんが)
 csvファイルにエクセルが絡むと本来のcsvファイルにこのような予期せぬ変更がされてしまう可能性がありますよ?
(seiya) 2018/01/18(木) 12:19

プロパティでプログラムをエクセルからメモ帳に変えて、
ダウンロードした(一度も開いていない)csv(メモ帳)でプログラムを起動してみましたが
やはり検索がひっかかりませんでした。

なので一回開いてみたら
"が二つありました。

最初からメモ帳なのに"が二つでてしまうのがよく分かりません(><)
(じゅじゅ) 2018/01/18(木) 13:09


 >"が二つありました。

 ということは、検索文字列もそのように入力してください。
(seiya) 2018/01/18(木) 13:21

"を二つに訂正したら処理できました!
わざわざ手動でやらないとできないのでしょうか。。

(じゅじゅ) 2018/01/18(木) 14:29


 言ってる意味が分かりません。

 手動だろうが、自動だろうが検索文字が違っていたらヒットしません。

 "が本来一つのものが二つになっているのなら、その原因を探るべきです。
 此方ではどうにもなりません。
(seiya) 2018/01/18(木) 14:52

元の情報であるシステム側からメモ帳にコピペすると、
htmlの"は一個でして、ダウンロードしてメモ帳で開くと"が二つあり
編集して上書き保存してシステム側からみると"が一つでちゃんと入っておりました。

エクセルとして開いた場合は"がひとつでした。

本来のものは"ひとつなんです、、

なので""と二つに増やさないとcsvデータは処理できないのかなと思いました。
エクセルで開いてすれば"は一つなんでしょうけども、htmlには外部リンクが含んており
ダウンロードデータの商品数が多いので開くのが重たくなります。

ですので、エクセルを開かず修正できたらいいなと思いご相談させて頂きました。

怒らせてしまって申し訳ございません。
(じゅじゅ) 2018/01/18(木) 15:01


 別に起こっていませんけど?

 >htmlの"は一個でして、ダウンロードしてメモ帳で開くと"が二つあり 
 >編集して上書き保存してシステム側からみると"が一つでちゃんと入っておりました。

 この辺が当方では再現できないのです。

 また、元のcsvをメモ帳で開いたものと、Excelから開いたものとで"にその様な差異が出ることが問題です。

 編集して元のシステムに読み込ませるようにするにはどうすればよいかは、じゅじゅさんの方で考えて
 ください。
(seiya) 2018/01/18(木) 15:34

ネットサーフィンをしていたら
https://tonari-it.com/vba-csv-double-quotation/
にダブルクォーテーションがついているcsvの取り込み方が書いておりました。

こちらとseiyaさんの作成したコードを合わせてできたりしないでしょうか?

色々も申し訳ございません。。
(じゅじゅ) 2018/01/18(木) 15:37


CSV内で文字列を入れる場合は「 ” 」で囲まないといけない、

文字列内に「 ” 」がある場合意味がおかしくなってしまうのでCSVファイルが自動で回避できるように補助してくれているのだと思ってます。
CSVで文字列入れる場合ははじめと最後に「 ” 」がつくので

"<a href="https://www.●●●.ne.jp/●●●/●●●/sp/index.html"> "
"<a href="

とここまでで区切ってしまってバグってしまいます。

これを回避するために文字列内の「 " 」は「 "" 」であらわすようにしているのだと思います。

自分なりに勉強してみました(><)
(じゅじゅ) 2018/01/18(木) 15:42


 それはcsvをエクセルに取り込むコードで、私のコード(csvファイル内容の置換)とは関連性がありません。
(seiya) 2018/01/18(木) 15:48

htmlファイルをCSVファイル扱いしようとしている事が、とっても無謀な事です。そのせいで勝手にダブルクォーテーションが付いたりして、余計な編集がかかってしまうのですよ? そして、「http:」を「https:」に変えるだけならば、正規表現なんて使う必要はなくて、標準命令の Replace関数で十分ではないですか? わざわざ処理をこねくり回して、難しく処理しようとしているように見えます。

とりあえず、まったくの別案で、定数定義したフォルダ以下にあるhtmlファイル全ての文字列を置換するコードを書いておきます。 一応、元のファイルはバックアップしていますが、2回動かすと上書きして消してしまうので、どこか別のフォルダに対象ファイルをコピーしてから動かしてみてください。 何をどう直したか…、というのは調べるのが面倒なので、変更があった場合だけシートに書き出すようにしています。

 Sub test()
    Const cPATH = "c:\temp\"
    Dim cFiles As Variant
    Dim F1 As Integer
    Dim i As Long
    Dim iR As Long
    Dim iw As Long
    Dim bw() As Byte
    Dim cOrg As String
    Dim cBuf As String
    Dim cBak As String

    Cells.ClearContents

    cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B/S """ & cPATH & "*.htm*""").StdOut().ReadAll(), vbNewLine)
    For i = 0 To UBound(cFiles) - 1
        iw = InStrRev(cFiles(i), ".")
        cBak = Left(cFiles(i), iw) & "bak"
        iw = FileLen(cFiles(i))
        ReDim bw(iw - 1)

        F1 = FreeFile()
        Open cFiles(i) For Binary As #F1
        Get #F1, , bw
        Close #F1

        cOrg = StrConv(bw, vbUnicode)
        cBuf = Replace(cOrg, "http:", "https:")
        If cOrg <> cBuf Then
            Cells(iR + 1, "A").Value = Mid(cFiles(i), InStrRev(cFiles(i), "\") + 1)
            If Dir(cBak) <> "" Then
                Kill cBak
            End If

            Name cFiles(i) As cBak

            F1 = FreeFile()
            Open cFiles(i) For Binary As #F1
            Put #F1, , cBuf
            Close #F1

            DoEvents
            iR = iR + 1
        End If
    Next i
 End Sub

(???) 2018/01/18(木) 16:03


 >わざわざ処理をこねくり回して、難しく処理しようとしているように見えます。 
 このような発言はこのスレの流れをよく読んでからにしてもらいたい。
(seiya) 2018/01/18(木) 16:10

貴重なご意見ありがとうございます。

一括編集するにはCSVダウンロードしてからしか方法がなくそのなかにHTMLも入っております。
HTMLの部分だけの置換でしたらダブルクォーテーションは仕方ないですね!

それ以外であればダブルクォーテーションは入っていない情報なので
SEIYAさんのコードでできますので使い分けようと思います。

seiyaさんの

 >わざわざ処理をこねくり回して、難しく処理しようとしているように見えます。 
 このような発言はこのスレの流れをよく読んでからにしてもらいたい。
(seiya) 2018/01/18(木) 16:10

は私宛ですよね?
申し訳ございませんでした。。

(じゅじゅ) 2018/01/18(木) 17:20


 違いますよ?
 あとから投稿してきた失礼な物言いをする投稿者に対してです。

 私の投稿で

 >というか、最初からメモ帳で開けば[置換]で全て解決しませんか?(件数は出ませんが)
 >csvファイルにエクセルが絡むと本来のcsvファイルにこのような予期せぬ変更がされてしまう可能性がありま
 >すよ?
(seiya) 2018/01/18(木) 12:19

 の通り、ただの置換ならこれだけで十分なはずで、VBAも必要ないのです。

(seiya) 2018/01/18(木) 17:33


 >わざわざ処理をこねくり回して、難しく処理しようとしているように見えます。 

はい、私はじゅじゅさんに向けた発言だったのですが、seiyaさんからのお怒りの言葉があって、あ、seiyaさんに向けたと思われた?、と考えました。 誤解させてすいません。

1行ずつ読んで変換していますが、いっそ1ファイル1回で全部読んで、いっきに置換して、1回で書いてしまえば簡単じゃ?、という別案でした。
(???) 2018/01/18(木) 17:39


seiyaさん

そういうことでしたか。
質問がややこしくて本当に申し訳ございません。
自分なりにもう少し試行錯誤してみます!

???さん
私むけだったらそのものいいでいいように聞こえますが。。
他の記事をみていてもいくつかお怒りの返信がお見受けできました。。

(じゅじゅ) 2018/01/19(金) 15:27


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.