プロが教える店舗&オフィスのセキュリティ対策術

マクロが全然できない為、教えていただけないでしょうか。

①下記のように1列各行に記入されたデータを各項目別でセル分割(抽出)したいです。
  (分かりずらくて申し訳ありません。)
O1000(MAIN)
N0006(2018/06/07)
N0010G00G17G40G49G64G80
N0011M00T07
N0015G90G20X100.0Y100.0Z100.0B100.0S1000F2000
N0020G04X0.5M11M111M112
N0030M50

O1000(MAIN)←題名
N   他  G G G G G G  M M M  X   Y   Z   B   S  F T
0006 (2018/06/07) 
0010    00 17 40 49 64 80
0011                00                          07
0015 90 20                100.0 100.0 100.0 100.0 1000 1000
0020    04          11 111 112 0.5
0030                50

②上記で分けたデータを別のデータと比較照合し、
  異なる個所を”背景:黄色”,”文字色:赤色”で層別したいです。
  主にシート1で基データ,シート2に比較データ
  <やりたいこと>
   シート2の比較データ側もしくは新規シート3に結果を表示するとして
   ⅰ.基データと異なる値は文字を色塗り
   ⅱ.基データにない行は背景を色塗り
   ⅲ.基データにあり、比較データにない行は比較データ側に追記(背景と文字塗りの合わせ技)

かなりわがままなお願いかもしれませんが、お助けいただけると幸いです。
よろしくお願いいたします。

質問者からの補足コメント

  • <補足>
    ①について補足です。
    データとは加工機械プログラムデータのことです。
    O1000(以下Oナンバー)は題名、
    N****(以下、Nコード)はプログラム内容のナンバリングしたものです。
    また、始めに提示させていただいた例題に抜け漏れがありましたので、
    更新させていただきました。(6/11・・PRG内容更新)

    ※更新例題は次の補足2に明記

      補足日時:2018/06/11 22:57
  • <補足2>

    ※以下は例題として架空のプログラムを提示しております。
    O1000(MAIN) ←題名
    N0010(2018/06/07) ←最新の更新日を履歴として書くことが多い
    N0020M00
    N0030G91G28X0.0Y0.0
    N0040 ←Nコード以降の内容がない行もあります
    N0050IF[#850EQ1.0]GOTO110 ←IFもありますが無視でOK
    N0060T01
    N0070M06X0.0Y0.0
    N0090M83

    N0100G90G10L2P0X0.0Y0.0Z0.0B0.0(B0.0)(G53)  ←()付きはコメントと履歴

    N0110(MENKAKOU B0.0) ←()付きはコメント
    N0120(TOOL / T01)  ←()付きはコメント
    N0130G00G17G40G49G64G80
    N0140T02

    以下、補足3へ続く

      補足日時:2018/06/11 23:20
  • <補足3>

    N0150G90G00G53X0.0Y0.0B0.0S2000M103M110
    N0160G43Z0.0H99M03M10   ←Hが追記(質問時漏れ項目)
    N0170G01X100.0(X90.0)Y100.0(Y80.0) F2000←()付きは履歴
    N0180G01X170.0Y160.0R5.0  ←Rが追記(質問時漏れ項目)
    N01900G01X0.0Y0.0
    N0200G90G00G49G53Z-150.0

    以上、これを基データとします。
    ___________________________________

    ②について、補足です。

    まず、
    ①の分割後に②を行うかどうかは白紙にさせてください。
    (①→②ではマクロ?関数?がややこしくなり兼ねる為)

    以下、補足4につづく

      補足日時:2018/06/11 23:22
  • <補足4>

    次に、
    比較データとは下記のことを示します。
    (基データと基本ベースは同じ)
    下記の←は起こりうる相違内容を説明しています。
    相違どの行でも起こり得ます。
    下記の()付き内はコメントとして利用されます。(履歴もコメントと同等のものです)
      ※あくまで、起こりうる相違内容なので事実とは異なります。

    <以下、比較データ>
    O1000(MAIN)
    N0010(2018/06/07)
    N0012(2018/06/10) ←N及び更新日追記
    N0020M00
    N0030G91G28X0.0Y0.0
    N0040
    N0050IF[#850EQ1.0]GOTO110
    N0060T01
    N0070M06X0.0Y0.0
    N0090M83

    以下、補足5へつづく

      補足日時:2018/06/11 23:23
  • <補足5>

    N0100G90G10L2P0X25.0(X0.0)Y0.0Z0.0B0.0(B0.0)(G53)  ←()付きで更新されている

    N0110(MENKAKOU B0.0)
    N0120(TOOL / T01)
    N0130G00G17G40G49G64G80
    N0140T02
    N0150G90G00G53X0.0Y0.0B0.0S2000M103M110
    N0160G43Z0.0H99M03M10
    N0170G01X100.0(X90.0)Y100.0(Y80.0)F2050←()無しで更新される(※たまにある)
    N0180 ←Nコード以降が削除される
    N0182G02X170.0Y160.0R5.0 ←Nコードが追加される
    N01900G01X0.0Y0.0
    N0200G90G00G49G53Z-150.0

    以下、補足6へつづく

      補足日時:2018/06/11 23:23
  • <補足6>

    最後に、
    ②でやりたいことは
    基データ(①で提示した例題)と比較データ(②で提示した例題)を照合した際に異なる情報を抽出(視覚化)したく、異なる内容を比較データ上に色分けで層別
    層別内容は質問時に提案したⅰ)~ⅲ)ができればありがたいです。

      <仕分け内容>
       比較データ側もしくは新規シートに結果を表示するとして
       ⅰ.基データと異なる値は文字を色塗り
       ⅱ.基データにない行は背景を色塗り
       ⅲ.基データにあり、比較データにない行は比較データ側に追記(背景と文字塗りの合わせ技)

    以上
    説明不足かつ、抜け漏れが多々ありご迷惑をおかけしました。
    上記を再度折込、ご教授いただけると幸いです。
    よろしくお願いいたします。

      補足日時:2018/06/11 23:24

A 回答 (26件中1~10件)

No.25です。



取り敢えず私が最初の頃に回答してた『ただ単に分割するだけ』のコードを提示しますので、
分割が漏れなく希望通りになっているかを確認願います。
ただし『IF』の含まれている部分については除外してます。

Sub megu2()
Dim re As Object
Dim r As Range, st As String
Dim rr As Range, match

Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^([NO]\d+)(\(.*\))$|\(?[A-Z][\d\.]+\)?(\([A-Z\d\.]+?\))?"
re.Global = True

For Each r In Range("A1", Cells(Rows.Count, "A").End(xlUp))
If re.Test(r.Value) And InStr(r.Value, "IF[") = 0 Then

Set rr = r.Offset(, 2)

If re.Execute(r.Value)(0).Submatches(1) <> "" Then
rr.Resize(, 2).Value = Array(re.Execute(r.Value)(0).Submatches(0), re.Execute(r.Value)(0).Submatches(1))
Else
For Each match In re.Execute(r.Value)
rr.Value = match
Set rr = rr.Offset(, 1)
Next
End If

End If
Next

Set re = Nothing
End Sub
    • good
    • 0

No.24です。



回答の方ではちょっとミスがありましたが、何となく伝わってくれたようで助かりました。

>なので『コメント行』については
>・半角文字の存在を認めていない

・半角スペースの存在を認めていない

ですね。

コードの改修についてはWindFallerさんから回答あるのかな?
    • good
    • 0
この回答へのお礼

大丈夫です、伝わりました^ ^
ありがとうございます。

WindFallerさんどうでしょうか。。私がダラダラしてたので、もう見限られちゃったかもしれませんね。

お礼日時:2018/06/28 12:48

No.23です。



自動締め切りギリでしたね。

>では、なぜ分類できないのか?が疑問です。

WindFallerさんが作成していたコードはまずツール(英字+数字希に小数点)を頭文字(英字)毎に列分けをするのを優先してます。
その際にイレギュラー要因として
・1行目にある『題名』
・2行目以降にある『日付』
の判断にとどまってます。

なので『コメント行』については
・半角文字の存在を認めていない
・日付書式(yyyy/mm/dd)以外の"/"の使用は考慮していない
為と思います。

WindFallerさんからの返信が止まってしまっているようですが、上記部分を修正するかいっそIF文のように分割から除外(判定とは別問題です)を選ぶのか・・・・?
となりそうです。
VBSの正規表現はその他言語よりもちょっと癖があるようで、余り複雑なPatternにしてしまうと折角成功していた部分で別の問題発生もあり得そうですが。。。
『コメント分については"/"は有無の場合があるとして"半角の空白文字"は必ず存在するのでしょうか?
それとも存在せず区切りのない1文だけと言うケースもあり得ますか?
    • good
    • 0
この回答へのお礼

ギリでした、、すみません。

いつも丁寧に説明頂いてありがとうございます。分かりやすく助かります。

今のコードでは、コメントは日付のみを見ているんですね。

そして、
"半角の空白文字"は"必ず"ではないです。区切りのない1文だけもあり得ます。

お礼日時:2018/06/28 08:25

No.22です。



>全角と半角で違うのでしょうか?

用いている『正規表現』においては元々が英語圏のものなので全角文字って扱いは本来無かった物です。(Microsoftもあっちですし)
それを日本ように『一応使えるべきだ』的な考えで追加されたような感じ(個人的には)ですので、扱いは変わってきます。
可能なら『全て半角』が良いのですが、そちらでのプログラム上に影響があってもダメですしね。

で、今回の作業が『あくまでもプログラムの確認であって分割した物を加工用プログラムとして使う訳ではなく、違いを把握したいだけ』であるなら、
本来とは違うので読みにくくなるかもですが事前に全て半角に変換した値で処理を行えれば回答者側は楽ですけれど。

そこで『全角になる箇所』とはどこになるのでしょうか?
今不具合のある
N0110(MENKAKOU B0.0)
N0120(TOOL / T01)
のような『コメント?』だけですか?
    • good
    • 0
この回答へのお礼

返信遅くなり、すみません。

もともと英語圏、、確かにそうですね、全角は日本独自のものという考えがしっくりきます。

プログラムを確認しましたが、全て半角でした。では、なぜ分類できないのか?が疑問です。

ちなみに()がついているのは、コメントのみとなります。

お礼日時:2018/06/27 23:26

No.21です。



>N0110のような、()付のものが他の列に入らず、消去されてしまいました。

N0010(2018/06/07)
N0012(2018/06/10)

こちらは大丈夫なのでしょうか?
それとも全部という事?

>[ ]付も同様でした。

これは

>N0050IF[#850EQ1.0]GOTO110 ←IFもありますが無視でOK

なので分割せずでも構わないと受け取って良いのですかな?
    • good
    • 0
この回答へのお礼

早朝からご対応ありがとうございます。

N0010(2018/06/07)
N0012(2018/06/10)
は大丈夫でした。

全角と半角で違うのでしょうか?
検証したPRGデータを確認してみます。
そうだとすると、全角が混じってしまう事があり得るので、半角、全角に関係なく抽出する事は可能なのでしょうか?

IFのところは確かにそう言いましたね、失礼しました。分割せずで大丈夫です。

お礼日時:2018/06/23 07:30

No.20です。



その後の検証は如何でしょう?
最終回答から1週間が過ぎると締め切られるらしいので、ちょっと時間稼ぎの為に書き込みました。
分割が上手くいっているかどうかが今後の鍵なので。
    • good
    • 0
この回答へのお礼

遅くなってしまい、申し訳ありません。その上、締め切り対応まで、、、恐縮です。

検証しました!
が、N0110のような、()付のものが他の列に入らず、消去されてしまいました。こまかい情報でも消去せず残しておきたいです。
[ ]付も同様でした。
その他は、問題なさそうです汗

お礼日時:2018/06/23 00:45

No.19です。



No.18のお礼にあるのは、No.8で使用されていた

Function ArrangeWords(ByVal sText As String, rng As Range)

End Function

と言うユーザー定義関数の部分だと思います。
ここを丸ごと追加で貼り付けて再検証されてみては?
    • good
    • 0

No.17です。



WindFallerさん 少しでもお役に立てたのは嬉しいです。

区切り記号については私は浅い知識しかないので詳しくはないですが、以前VB.NETを始めた頃に回答する際正規表現でVBSの参照設定を使用していたら、
別回答者から”System.Text.RegularExpressions.Regex”を使う事を薦められ以降はもっぱらこちらで正規表現は勉強してました。
なんか昔からVBSの正規表現は使いにくいのか癖があるのか、後から出てきたテキストエディタとかの方が良かったりと感じます。
進歩はしてくれないんでしょうかね?
(どのみちうちのはお古ですけど)

と、分割についての検証の結果連絡もまだのようですが、分割に問題がないようであれば希望としては②は新たな質問を立ててもらって、
この質問リンクも貼って貰えたら回答件数が長引かずにとは思っているのですけど。

私の方は比較双方が同じ個数であればともかく、比較データに追加項目があった場合どうするか?で悩み中・・・と言うかやっぱ力尽きるかも?な予感も。
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまい申し訳ありません。
出張の為、PC、スマホを手放していました。

頂いたPrgでの分割検証については、
No16のお礼で詳細書かせていただきましたが、
実行できず、エラー表示がでました。
対処方法がわからず、検証できていない状態です。

もしおわかりになれば、ご教授いただけると幸いです。

②については、
確かに質問を新たに立てたほうがいいかもしれませんね。
ありがとうございます。
長期的にご対応いただいて恐縮です。なにとぞよろしくお願いいたします。

お礼日時:2018/06/18 05:46

こんにちは。



めぐみん_さん、すみません、ありがたく、利用させていただきます。
最近、すっかり根気がなくなってしまいました。これでも、正規表現はいまさら、再度勉強しているのですが……。
一応、また、再編成したベースになるものを作りましたので、ご利用ください。

でも、私の経験と勘では、区切り信号(delimiter)は存在するはずなのです。

'//標準モジュール データのある場所をアクティブシートとする
Sub SplitRegExp1()
''ver 1.02 '2018/06/13
Const MYLIST As String = "N,他,G,G,G,G,G,G,G,M,M,M,M,M,H,R,X,Y,Z,B,S,F,T"
Dim Re As Object
Dim Ms, m
Dim c As Variant
Dim a As String
Dim i As Long, k As Long, cnt As Long, n As Long
Dim p As Long
Dim Ar As Variant
Dim buf As Variant
Dim myLists As Variant
Dim sh2 As Worksheet
Set sh2 = Worksheets("Sheet2") '★出力シート

p = 1 'データ開始行
n = 1 '出力開始行

'MYLISTを直したときには、必ず、Function 内のSelect Case の数字も変えてください。
myLists = Split(MYLIST, ",")
If sh2.Cells(n, "A").CurrentRegion.Cells.Count > 2 Then
 If MsgBox(sh2.Name & "は削除してよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
End If
sh2.UsedRange.ClearContents
'題名とタイトル行
With sh2
 buf = Split(Cells(p, 1).Value, "(")
 sh2.Cells(n, 2).Value = "(" & buf(1)
 .Cells(n, 1).Value = buf(0) '題名
 .Cells(n + 1, "A").Resize(, UBound(myLists) + 1).Value = myLists
End With
n = 3
Set Re = CreateObject("VBScript.RegExp") '正規表現
With Re
 .Global = True: .IgnoreCase = False: .MultiLine = False
End With
For Each c In Range(Cells(p + 1, 1), Cells(Rows.Count, 1).End(xlUp)) 'データ範囲
 a = c.Value
 If c.Value <> "" And c.Value Like "[A-Z][0-9]*" Then
  If c.Value Like "*####/##/##*" Then '日付
  buf = Split(c.Value, "(")
  sh2.Cells(n, 2).Value = "(" & buf(1)
  If UCase(Left(buf(0), 1)) = "N" Then
   sh2.Cells(n, 1).Value = "'" & Mid(buf(0), 2) '日付
  End If
  Else
  If InStr(1, c.Value, "(", 1) = 0 Then ''('のテキストコンペア
   Re.Pattern = "[^\d](\-?\d[\d\.]+)" '●正規表現パターン
   '一応残してあります。
  Else
   'めぐみん_さんのパターン
   Re.Pattern = "(\()?[A-Z][\d\.]+(\))?(\([A-Z\d\.]+?\))?" '●正規表現パターン
  End If
  Set Ms = Re.Execute(StrConv(c.Value, vbNarrow)) '半角括弧にしました。
  cnt = Ms.Count
  If cnt > 0 Then
   ReDim Ar(cnt - 1)
   For Each m In Ms
   Ar(i) = m.Value
   i = i + 1
   Next m
   For k = 0 To UBound(Ar)
   ArrangeWords Ar(k), sh2.Cells(n, 1)
   Next k
   i = 0
   Erase Ar
  Else
   '' sh2.Cells(n, 1).Value = c.Value
  End If
  End If
  n = n + 1
 End If
Next c
''この項目は、文字を中央にするためのもので、不要だったら削除してください。
'sh2.Range("A1").Resize(n, UBound(myLists) + 1).HorizontalAlignment = xlCenter
MsgBox "終了", vbInformation
End Sub
    • good
    • 0
この回答へのお礼

お礼が遅くなってしまい申し訳ありません。出張しておりました。
頂いたPrgを投入して実行を押してみたのですが、
ArrangeWordsというところで引っかかって、進めませんでした。

”コンパイルエラー、SubもしくはFunctionが定義されていません”

となってしまいます。

マクロに疎く、解決策を検索しましたが、
わからずじまいでした。

もし、お分かりでしたら教えていただけないでしょうか。。。

お礼日時:2018/06/18 05:39

No.16です。



No.16は基になったデータの方に全角括弧があった為のようです。

N0100G90G10L2P0X0.0Y0.0Z0.0B0.0(B0.0)(G53) N0100 G90 G10 L2 P0 X0.0 Y0.0 Z0.0 B0.0(B0.0) (G53)
N0170G01X100.0(X90.0)Y100.0(Y80.0)F200    N0170 G01 X100.0(X90.0) Y100.0(Y80.0) F200

尚Patternは
re.Pattern = "(\()?[A-Z][\d\.]+(\))?(\([A-Z\d\.]+?\))?"
に纏めてみました。


老眼がくやしぃ~。
「マクロできる方教えてください!データの」の回答画像17
    • good
    • 0

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