Indexへ
(33102)// 【33098】→(33099) ------------------------ 【タイトル】文字の修正方法
【記事番号】 33098 (*)
【 日時 】09/02/20 10:08
【 発言者 】まっちゃん
図面に書かれている文字の修正方法をしえてください
Indexへ
(33098)← 【33099】→(33100) ------------------------ 【タイトル】Re(1):文字の修正方法
【記事番号】 33099 (33098 )
【 日時 】09/02/20 10:52
【 発言者 】Fu〜
【 リンク 】http://homepage3.nifty.com/fu-/
▼まっちゃんさん:
>図面に書かれている文字の修正方法をしえてください
変更したい文字を、左クリック・・・修正・・・エンター
(Jwwの下段にある、メッセージバーを見て下さい)
Jww以外で作成したデータの場合は、色々ある場合があります・・・・・・
06−12
あたりも参考にしてください
http://e-desune.net/jww/
Indexへ
(33099)← 【33100】→(33103) ------------------------ 【タイトル】Re(1):文字の修正方法
【記事番号】 33100 (33098 )
【 日時 】09/02/20 11:51
【 発言者 】ai
【 リンク 】http://ohayou-oyasumi.webdeki-bbs.com/
▼まっちゃんさん:
通常の置換方法なら
http://jwwfaq.undo.jp/faq07_26.html
dmeというソフトを使うと複数図面の文字を図面を開かずに一気に置換できます。
サイト元 http://f884leap.yh.land.to/
ダウンロード先 http://f884leap.yh.land.to/
1つの図面内の置換で10文字までなら
http://homepage2.nifty.com/kiti_ku/index.html
の複数文字列置換が楽かなと思っています。
1つの図面内の置換で大量の文字なら
http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=32816;id=004
のスレッドのsugiさんの提示しているデータでいけると思います。
(集成があったりするので一通り目は通してください)
設定方法は話の流れ見れば大体分かるかと。
処理が甘く動作怪いので利用は自己責任になりますが、
通常の置換方法にエクセルを介在させて文字を一気に置換するものを作ってみました。
(置換表をエクセルに記入できるので自分的には楽)
上部の私の名前の横のWの文字からいけます。
エクセル置換はいろいろ無理やりな部分があるので訂正案いただけると
うれしかったりします。
Indexへ
(33100)← 【33103】→(33109) ------------------------ 【タイトル】Re(2):文字の修正方法
【記事番号】 33103 (33100 )
【 日時 】09/02/20 13:09
【 発言者 】いっち
▼aiさん:
こんにちは。
>エクセル置換はいろいろ無理やりな部分があるので訂正案いただけると
>うれしかったりします。
訂正案は、ありません。
作り方は、人それぞれだと思います。
----------------------------------------------------------------------
excel外変の作り方が、aiさんと僕は全然違うので、
こういう作り方もありますっていう事を、書いてみます。
1.外部エディタにexcelは、設定していません。
2.アドインにもしていません。
3.jw_cadの外部変形から、excelを開きます。
但し、batファイルから、いきなりexcelブックを開くのではなく、
vbsファイルを経由させます。
そうすることよって、下記のメリットがあります。
1)excelのAutomationSecurityプロパティの規定値は、1ですので、
vbsからCreateObject〜Workbooks.Openで開く場合には、
マクロを有効にして開くか、無効にして開くかを選択する必要は
ありません。
尚、vbsから開くときは、Visible = True としない場合には、
画面にexcelのシートは表示されません。
2)vbsからCreateObject〜Workbooks.Openで開く場合には、
excel.exeのパスを気にする必要はありません。
3)vbsを経由すると、jw_cadの外変用batファイルからの
コマンドラインを、excelに送る事もできます。
excelのAuto_Openで受け取る時に、ParamArrayで受ければ、
そのexcelブックは、普通に開くときも支障がでません。
----------------------------------------------------------------------
上記、要点のみで、申し訳ないです。
あくまで、一例です。
Indexへ
(33103)← 【33109】→(33110) ------------------------ 【タイトル】Re(3):文字の修正方法
【記事番号】 33109 (33103 )
【 日時 】09/02/20 20:01
【 発言者 】ai
▼いっちさん:
丁寧にありがとうございます。
エクセルマクロをかじり始めたばかりという感じでプログラミングの基礎すら分かってないので
申し訳ないのですが教えていただいたことが具体的にどういうことなのかよく分かっておりません。
置換は外部エディタを経由せずにバッチファイル(VBSファイル?)で行い、
置換実行する際にエクセルを開くor開かないは選択でき、
エクセル内の内容で置換実行するということでしょうか?
実行するためにどういうプログラムを書けばいいのか想像もつかないため、
自分で作るより公開してるデータを探したほうがいいのかと「VBS エクセル jw 置換」などで
検索してみています。
外部変形も勉強し始めてるところなので分かりだしたら試してみたいと思います。
ありがとございます。
Indexへ
(33109)← 【33110】→(33111) ------------------------ 【タイトル】Re(4):文字の修正方法
【記事番号】 33110 (33109 )
【 日時 】09/02/20 22:15
【 発言者 】いっち
▼aiさん:
エクセルで、JWC_TEMP.TXT(テキストファイル)を読み込む方法なら、
書籍、インターネット等で、調べられると思います。
置換はもちろん、読み込んだJWC_TEMP.TXTをエクセルで加工すれば
良いです。
----------------------------------------------------------------
>VBS
エクセルを勉強していくと、必ずVBSの知識が必要になる時がきます。
一般の書店で、下記VBS関係の書籍が購入できると思います。
1.VBScriptポケットリファレンス (株)アンク著
2.VBScript逆引き大全500の極意 井川はるき著
3.VBScriptサンプル大全集 結城圭介著
上記を、読むのは、肝心のエクセルを、もう少し学ばれてからで、
良いような気もします。
Indexへ
(33110)← 【33111】→(33112) ------------------------ 【タイトル】Re(5):文字の修正方法
【記事番号】 33111 (33110 )
【 日時 】09/02/20 23:12
【 発言者 】ai
▼いっちさん:
参考書の例ありがとうございます。
レビュー見たら基本は分かっていないと駄目とありましたので、
分かりだしたら活用させていただきたいと思います。
JWC_TEMP.TXTファイルに文字情報だけ抜き出す(jwwは待機状態にしておく?)
作業はVBSでするということでしょうか?
jww付属の説明書にあるバッチファイルの文字取得のコード(?)だと
文字以外にも位置情報なども一緒に破棄出されてしまって
いろいろな情報の中から文字情報だけをエクセルで処理できる
自信がなく試す前に挫折してしまっています。
Indexへ
(33111)← 【33112】→(33114) ------------------------ 【タイトル】エクセル置換のマクロ訂正予定です
【記事番号】 33112 (33100 )
【 日時 】09/02/21 00:10
【 発言者 】ai
エクセル置換ですが、エクセルのLOSEの際に実行されるマクロで
TEMP.TEXTに置換後のデータ貼り付けしているのですが張り付け前に
置換前のデータをクリアしていないので置換ミスが起こる可能性があります。
後で訂正したのUPしなおそうと思います。
理由として他キャドから変換したjwwデータですと半角・全角スペースなども
入っていない完全な空白文字が存在することがあるのですが、
その完全に空白な文字がある場合、削除しないと文字位置がずれてしまいます。
外部エディタをNOTEPADにし、外部エディタから文字取得し
置換作業の処理などを一切せずに上書き保存して閉じても文字位置がずれます。
それが理由で置換用エクセル上で空白行削除のマクロをかけているのですが、
データをTEMP.TEXTに差し戻したときに範囲コピーしたデータをA1セルに
貼り付けるように設定してしまっていたので、
削除された空白行分のみjwに戻ったときに文字が多くなってしまう可能性があります。
後で訂正しようと思います。
Indexへ
(33112)← 【33114】→(33116) ------------------------ 【タイトル】Re(1):エクセル置換のマクロ訂正予定です
【記事番号】 33114 (33112 )
【 日時 】09/02/21 00:39
【 発言者 】いっち
▼aiさん:
>後で訂正しようと思います。
わかりました。
ご自身が納得いくものが、いちばん良いと思います。
Indexへ
(33114)← 【33116】→(33121) ------------------------ 【タイトル】Re(2):エクセル置換のマクロ訂正予定です
【記事番号】 33116 (33114 )
【 日時 】09/02/21 03:47
【 発言者 】ai
▼いっちさん:
もし試した方がいた際に図面の文字ずれて気づかずそのままだと危ないので
報告&訂正予定にさせていただきました。
バッチファイルの勉強のほうを優先していますが
VBSに関しては検索してみて調べてみてます。
エクセルに近い感じのようなのでバッチファイルの記述方法よりは
わかりやすいかなと思ってます。
(文字情報だけ抜き出す動作に関してはどうすれば良いのか見当すらつきませんが)
バッチファイルのほうは宇宙語見てる気分というか内容がなかなか噛み砕けなくて
ちんぷんかんぷんです。
勉強中ではありますが、VBSキーワードに検索して完成品ないか
探してたりもします。
(自分が作成できるようになるには道のりが長そうなので)
Indexへ
(33116)← 【33121】→(33124) ------------------------ 【タイトル】Re(3):エクセル置換のマクロ訂正予定です
【記事番号】 33121 (33116 )
【 日時 】09/02/21 10:50
【 発言者 】いっち
▼aiさん:
まず始めにJw_cadで、JWC_TEMP.TXTを書き出してみてください。
(ファイル名は何でも良いですが、たとえば、Moji_Nukidashi.batとか。)
@REM 文字情報をエクセルへ書き出すためJWC_TEMP.TXTを書き出す
@echo off
REM #jww
REM #cd
REM #h0
REM #zz
REM #bz
REM #1ch 変更する文字列をクリックして下さい。
REM #99#
REM #e
-----------------------------------------------------------------------
つぎに下記のマクロを入れたエクセルブックを
上で書き出したJWC_TEMP.TXTと同じフォルダーに置いてください。
そして、VBEにて、表示〜ローカルウィンドウを表示させ、
F8キーにて、ステップ実行を行ってみてください。
外部変形の完成品のコードでは、ありません。
>文字情報だけ抜き出す動作に関してはどうすれば良いのか見当すらつきません
にお答えした一例です。
マクロの実行が終わると、Sheet1に文字が書き出されると思います。
※掲示板だと、コードが読みづらくなったり、
もしかすると、半角スペースが半角スペースでなくなったり
するかもしれません。
-----------------------------------------------------------------------
Option Explicit
Sub MojiNukidashi()
Dim myFile As String, ss As String, strtemp() As String
Dim myFlg As Boolean
Dim myCount As Long
Dim v As Variant
myFile = ThisWorkbook.Path & Application.PathSeparator & "JWC_TEMP.TXT"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, ss
If myFlg Then
Select Case True
Case ss Like "ch*", ss Like "cs*"
myCount = myCount + 1
strtemp = Split(ss, " ", 6)
v(myCount, 1) = Mid$(strtemp(5), 2)
End Select
Else
Select Case True
Case ss Like "hp[0-9]*"
myCount = myCount + 1
Case ss = "bz"
ReDim v(1 To myCount, 1 To 1)
myFlg = True
myCount = 0
End Select
End If
Loop
Close #1
With Sheet1.Range("$A$1").Resize(UBound(v, 1), 1)
.ClearContents
.Value = v
End With
End Sub
Indexへ
(33121)← 【33124】→(33137) ------------------------ 【タイトル】Re(4):エクセル置換のマクロ訂正予定です
【記事番号】 33124 (33121 )
【 日時 】09/02/21 20:24
【 発言者 】ai nekobasu83@yahoo.co.jp
▼いっちさん:
文字だけ抜き出せました、ありがとうございます。
バッチ側に
start Excel.exe C:\jww\文字\複数同時置換.xls
を加えてエクセル側のマクロを
Private Sub Workbook_Open()
に変えて自動実行できました。
1文字ずつの抜き出しですので
http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=32816;id=004
でかいた全レイヤの文字を抜き出す方法でデータを抜き出すと
エラーになってしまうので、調べようと思います。
"CH*"探して抜き出してるんだと思ったのですがまだ解読が進んでいません。
書き戻す方法は文字の位置情報とか色情報とかレイヤ情報は残したままで
文字部分だけをTEXTファイルに書き戻してそれをjwwで読み込むのかと思ってるのですが、
数III、数Cで完全挫折して赤点とったような頭なので記述が難しそうでできる
自信はあまりないですorz
Indexへ
(33124)← 【33137】→(33156) ------------------------ 【タイトル】Re(5):エクセル置換のマクロ訂正予定です
【記事番号】 33137 (33124 )
【 日時 】09/02/22 10:00
【 発言者 】いっち
▼aiさん:
おはようございます。
>バッチ側に
>start Excel.exe C:\jww\文字\複数同時置換.xls
>を加えて
の部分は、
start /wait Excel.exe C:\jww\文字\複数同時置換.xls
としてください。
ブックを開くと同時に、実行させる部分は、ご自分で行ってください。
sheet1の1枚のみで扱うコードです。
尚、ここで書いているsheet1は、シート名ではなく、
シートのオブジェクト名です。
置き換えをマクロで行うコードは、入っていません。
但し、手入力で置き換える文字を入力することは出来ます。
1つの文字列について、置き換え前の文字数と置き換え後の文字数が
異なる時、期待通りの文字の配置にするようなコードは、
入っていません。
'--------------------------------------------------------------------------
Option Explicit
Sub myFileInput()
'始めの読み込み
'sheet1のA2セルから下に書き出す。
Dim myFile As String, strtemp() As String
Dim myFNo As Integer
Dim v As Variant, tmpv As Variant, ss As Variant
Dim i As Long, j As Long
myFile = ThisWorkbook.Path & Application.PathSeparator & "JWC_TEMP.TXT"
myFNo = FreeFile
On Error GoTo errhdl
Open myFile For Input As #myFNo
On Error GoTo 0
ss = StrConv(InputB(LOF(myFNo), #myFNo), vbUnicode)
Close #myFNo
While Right$(ss, 2) = vbCrLf
ss = Left$(ss, Len(ss) - 2)
Wend
ss = Split(ss, vbCrLf)
ReDim tmpv(1 To UBound(ss) - 14)
For i = 0 To UBound(ss)
Select Case True
Case ss(i) Like "c[hvs]*"
j = j + 1
strtemp = Split(ss(i), " ", 6)
tmpv(j) = Mid$(strtemp(5), 2)
End Select
Next
ReDim Preserve tmpv(1 To j)
ReDim v(1 To j, 1 To 1)
For i = 1 To UBound(v, 1)
v(i, 1) = tmpv(i)
Next
With Sheet1
With .Range("A2").Resize(UBound(v, 1), 1)
.ClearContents
.Value = v
End With
.Columns.Item("A:A").AutoFit
End With
errhdl:
End Sub
Sub myFileOutput()
'Jw_cadへ戻す
'変更するもののみ、sheet1のB2セルから下に書き出しておけば問題なし。
'(↑変更前と変更後は、横に並べて書いてください。)
Dim myFile As String, strtemp() As String
Dim myFNo As Integer
Dim v As Variant, ss As Variant
Dim i As Long, j As Long
Dim LastRow As Long
myFile = ThisWorkbook.Path & Application.PathSeparator & "JWC_TEMP.TXT"
myFNo = FreeFile
Open myFile For Input As #myFNo
ss = StrConv(InputB(LOF(myFNo), #myFNo), vbUnicode)
Close #myFNo
While Right$(ss, 2) = vbCrLf
ss = Left$(ss, Len(ss) - 2)
Wend
ss = Split(ss, vbCrLf)
With Sheet1
LastRow = .Range("B" & .Rows.Count).End(xlUp).Row
If LastRow < 2 Then Exit Sub
With .Range(.Range("B2"), .Range("B" & LastRow))
If LastRow = 2 Then
ReDim v(1 To 1, 1 To 1)
v(1, 1) = .Value
Else
v = .Value
End If
End With
End With
For i = 0 To UBound(ss)
Select Case True
Case ss(i) Like "c[hvs]*"
j = j + 1
If j <= UBound(v, 1) Then
If Len(v(j, 1)) > 0 Then
strtemp = Split(ss(i), " ", 6)
strtemp(5) = Left$(strtemp(5), 1) & v(j, 1)
ss(i) = Join(strtemp)
End If
End If
Case ss(i) = "hq"
ss(i) = "hd"
End Select
Next
myFNo = FreeFile
Open myFile For Output As #myFNo
Print #myFNo, Join(ss, vbCrLf)
Close #myFNo
ThisWorkbook.Saved = True
Application.Quit
End Sub
Indexへ
(33137)← 【33156】→(33162) ------------------------ 【タイトル】VBS動作できました
【記事番号】 33156 (33137 )
【 日時 】09/02/23 14:35
【 発言者 】ai
▼いっちさん:
書き込みできました、コードほんとうにありがとうございます。
すごく快適な動作です。
jwへの書き込みをエクセルのAuto_Closeの際に自動実行するようにました。
あと、jwc_temp.textの場合は完全な空白の文字があった際の空白削除がいるのか
どうかが分からず悩み中です。
外部エディタで文字取得した場合は場合は完全な空白でスペースも何も入っていない
改行だけの行は行削除しないと文字ずれを起こすのですがそれは他CADからの
変換データなどにしか存在しないようなので、
文字ずれを起こすデータがなく検証ができない状態です。
↓成功コード
*********エクセル**********
Private Sub Workbook_Open()
Call データ削除
Call jwwデータ取得
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Sheets("置換").Select
If Range("D2").Value = "変換する" Then
If Range("D5").Value = "" Or Range("D8").Value = "" Or Range("F2").Value = "" Or Range("F5").Value = "" Or Range("F8").Value = "" Or Range("F11").Value = "" Or Range("F14").Value = "" Then
MsgBox "置換条件が選択されていません"
Set kakRng = Nothing
Cancel = True
Exit Sub
End If
ElseIf Range("D2").Value = "変換しない" Then
If Range("D5").Value = "" Or Range("D8").Value = "" Then
MsgBox "置換条件が選択されていません"
Set kakRng2 = Nothing
Cancel = True
Exit Sub
End If
Else
MsgBox "置換条件が選択されていません"
Cancel = True
Exit Sub
End If
End Sub
Option Explicit
Sub jwwデータ取得()
'始めの読み込み
'sheet1のA2セルから下に書き出す。
Dim myFile As String, strtemp() As String
Dim myFNo As Integer
Dim v As Variant, tmpv As Variant, ss As Variant
Dim i As Long, j As Long
Call データ削除
myFile = ThisWorkbook.Path & Application.PathSeparator & "JWC_TEMP.TXT"
myFNo = FreeFile
On Error GoTo errhdl
Open myFile For Input As #myFNo
On Error GoTo 0
ss = StrConv(InputB(LOF(myFNo), #myFNo), vbUnicode)
Close #myFNo
While Right$(ss, 2) = vbCrLf
ss = Left$(ss, Len(ss) - 2)
Wend
ss = Split(ss, vbCrLf)
ReDim tmpv(1 To UBound(ss) - 14)
For i = 0 To UBound(ss)
Select Case True
Case ss(i) Like "c[hvs]*"
j = j + 1
strtemp = Split(ss(i), " ", 6)
tmpv(j) = Mid$(strtemp(5), 2)
End Select
Next
ReDim Preserve tmpv(1 To j)
ReDim v(1 To j, 1 To 1)
For i = 1 To UBound(v, 1)
v(i, 1) = tmpv(i)
Next
With Sheet1
With .Range("A2").Resize(UBound(v, 1), 1)
.ClearContents
.Value = v
End With
.Columns.Item("A:A").AutoFit
End With
errhdl:
End Sub
Sub 変換データ記入()
'Jw_cadへ戻す
'変更するもののみ、sheet1のB2セルから下に書き出しておけば問題なし。
'(↑変更前と変更後は、横に並べて書いてください。)
Dim myFile As String, strtemp() As String
Dim myFNo As Integer
Dim v As Variant, ss As Variant
Dim i As Long, j As Long
Dim LastRow As Long
myFile = ThisWorkbook.Path & Application.PathSeparator & "JWC_TEMP.TXT"
myFNo = FreeFile
Open myFile For Input As #myFNo
ss = StrConv(InputB(LOF(myFNo), #myFNo), vbUnicode)
Close #myFNo
While Right$(ss, 2) = vbCrLf
ss = Left$(ss, Len(ss) - 2)
Wend
ss = Split(ss, vbCrLf)
With Sheet1
LastRow = .Range("B" & .Rows.Count).End(xlUp).Row
If LastRow < 2 Then Exit Sub
With .Range(.Range("B2"), .Range("B" & LastRow))
If LastRow = 2 Then
ReDim v(1 To 1, 1 To 1)
v(1, 1) = .Value
Else
v = .Value
End If
End With
End With
For i = 0 To UBound(ss)
Select Case True
Case ss(i) Like "c[hvs]*"
j = j + 1
If j <= UBound(v, 1) Then
If Len(v(j, 1)) > 0 Then
strtemp = Split(ss(i), " ", 6)
strtemp(5) = Left$(strtemp(5), 1) & v(j, 1)
ss(i) = Join(strtemp)
End If
End If
Case ss(i) = "hq"
ss(i) = "hd"
End Select
Next
myFNo = FreeFile
Open myFile For Output As #myFNo
Print #myFNo, Join(ss, vbCrLf)
Close #myFNo
ThisWorkbook.Saved = True
Application.Quit
End Sub
Sub データ削除()
Worksheets("置換").Unprotect
Application.EnableEvents = False 'エクセルのイベント処理を無効にする
If Columns("A:B").SpecialCells(xlCellTypeLastCell).Address <> "$A$2" Then
Worksheets("置換").Range("A2:B65536").Delete Shift:=xlUp
Worksheets("置換").Range("A2:B65536").NumberFormatLocal = "@"
End If
Worksheets("置換").Protect Contents:=True, Scenarios:=True, AllowFormattingColumns:=True
Application.EnableEvents = True 'エクセルのイベント処理を有効にする
End Sub
*****batファイル************
@REM 文字置換
@echo off
REM #jww
REM #cd
REM #h3 範囲内の文字データのみを選択
REM #hc ■範囲を指示してください。■
REM #g1 全レイヤを選択範囲にする
start /wait Excel.exe C:\jww\文字\複数同時置換.xls
REM #e
:END
Auto_Closeに書き込み用のVBSをCallで組み込んでしまうとWorkbook_BeforeCloseの
Application.WorksheetFunction.CountAが上手くいかなくなるようなのでいじり中です。
(文字が記入されていても結果が0になる、
VBAに何も処理せずにVBS組み込んでしまっているのが原因だとは思うのですが)
↓失敗してしまうデータ
いまのとこIf Range("D5").Value = "" Or Range("D8").Value = "" Thenと
1個1個確認して動作させています。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'<変換規則がきちんと選択されているかチェック>
Dim kakRng As Range
Dim Kak As Byte
Dim kakRng2 As Range
Dim Kak2 As Byte
Sheets("置換").Select
If Range("D2").Value = "変換する" Then
Set kakRng = Range("D5,D8,F2,F5,F8,F11,F14")
Kak = Application.WorksheetFunction.CountA(kakRng)
If Kak < 7 Then
MsgBox "置換条件が選択されていません"
Set kakRng = Nothing
Cancel = True
Exit Sub
End If
ElseIf Range("D2").Value = "変換しない" Then
Set kakRng2 = Range("D5,D8")
Kak2 = Application.WorksheetFunction.CountA(kakRng2)
If Kak2 < 2 Then
MsgBox "置換条件が選択されていません"
Set kakRng2 = Nothing
Cancel = True
Exit Sub
End If
Else
MsgBox "置換条件が選択されていません"
Cancel = True
Exit Sub
End If
End Sub
VBSの中身はまだ分かっていなくて
http://sapporo.cool.ne.jp/avg/vbs/
http://www.kanaya440.com/contents/script/
http://www.whitire.com/vbs/
http://tryasp.winscom.co.jp/document/vbscript/11.htm
あたりで勉強中です
Indexへ
(33156)← 【33162】→(33164) ------------------------ 【タイトル】jww-エクセルサイト&パスの通し方発見 &
【記事番号】 33162 (33156 )
【 日時 】09/02/23 15:55
【 発言者 】ai
何度も書き直しすみません。
batファイル下記で自動でパス取得してくれるゆになりました。
エクセルとバットファイルを同じフォルダに放り込むだけで実行することができるように
なりそうです。
@REM 文字置換
@echo off
REM #jww
REM #cd
REM #h3 範囲内の文字データのみを選択
REM #hc ■範囲を指示してください。■
REM #g1 全レイヤを選択範囲にする
start /wait Excel.exe %~dp0複数同時置換.xls
REM #e
:END
あとさまよってたらjww-エクセル変換サイト見つけたのですが、
http://homepage2.nifty.com/a-yonei/Perl4jw61.html
VBSファイルが別途あるようです。
VBSのコードをエクセルに直接記入して動くんでOKだと思ってやってしまてったのですが
実はまずいんでしょうか?
検索中ですがよくわかっておりません。
また、エクセルのA列・B列比較して記入していくようなので、
エクセルで連続して置換する場合に置換後のB列の文字をA列にコピーして
繰り返し置換させる設定だったのですが、
A列の元データが消えてしまうのでA列そのままでB列だけで
置換繰り返すように直す予定です。
Indexへ
(33162)← 【33164】→(33170) ------------------------ 【タイトル】Re(1):jww-エクセルサイト&パスの通し方発見 &
【記事番号】 33164 (33162 )
【 日時 】09/02/23 17:39
【 発言者 】いっち
▼aiさん:
こんばんは。
>If Range("D5").Value = "" Or Range("D8").Value = "" Or
下記みたいな感じでできますか?
With Sheet1のところは、実情に合わせてください。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim r As Range
On Error Resume Next
With Sheet1
Set r = .Range("D5,D8,F2,F5,F8,F11,F14") _
.SpecialCells(xlCellTypeBlanks)
End With
On Error GoTo 0
If Not r Is Nothing Then
MsgBox "置換条件が選択されていません。"
Set r = Nothing
Cancel = True
End If
End Sub
---------------------------------------------------
>VBSファイルが別途あるようです。
>VBSのコードをエクセルに直接記入して動く
僕の書いたコードは、vbsではなく、普通のコードです。
vbsで用いるオブジェクトを、エクセルのコードの中で、
用いるケースはよくあります。(利用可能なものは)
Indexへ
(33164)← 【33170】→(33175) ------------------------ 【タイトル】変換部分訂正コード
【記事番号】 33170 (33164 )
【 日時 】09/02/23 19:13
【 発言者 】ai
▼いっちさん:
説明ありがとうございます。
>僕の書いたコードは、vbsではなく、普通のコードです。
While ~ Wendを見たことがなくて
http://tryasp.winscom.co.jp/document/vbscript/11.htm
にあったんでVBSかと思ってました。
調べたらVBAも同じものがありました、完璧に勘違いしてたようで申し訳ありません。
http://web.pi-ppi.com/vba/b01/000296.html
>vbsで用いるオブジェクトを、エクセルのコードの中で、
>用いるケースはよくあります。(利用可能なものは)
ありがとうございます、安心しました。
頂いたコードですが、判定できたのですが、Workbook_BeforeClose の前にAuto_Closeが
実行されるようで「Call 変換」のほうにあるMsgBox "置換条件が選択されていません。"が先に出てきて
"置換条件が選択されていません。"が2回表示され、Workbook_BeforeCloseのCancel = Trueは実行されず
そのままブックを閉じるかどうかの質問が出てくるようです。
A:B列比較記入用の置換用の訂正データ(かぶってるコードが多いので減らせそうですが手を付けれていません)
Sub 変換()
Application.ScreenUpdating = False '★★★★★★★★★画面の描画をOFFにします
Application.EnableEvents = False '**********エクセルのイベント処理を無効にする
Dim ZykenSu As Byte '0〜255(正の整数値)
Dim i As Byte
Dim Max_row As Long '-2,147,483,648 〜 2,147,483,647(正/負の整数値)
Dim col As Byte '0〜255(正の整数値)
Dim ZykenRng As Range
Dim A_rng As Range
Dim Hyo_rng As Range
Dim B_rng As Range
Dim MC As String
Dim MB As String
Dim LA As String
Worksheets("置換").Unprotect
'If Range("D2").Value = "変換しない" Then
'<全半角・大小文字変換>
Call 全半大小変換2
Worksheets("置換").Protect Contents:=True, Scenarios:=True
Application.ScreenUpdating = True '*************************************
Application.EnableEvents = True '★★★★★★★★★★★★★★★★★★★★
Selection.Copy
Exit Sub
End If
Set ZykenRng = Range("D5,D8,F5,F8,F11,F14")
ZykenSu = Application.WorksheetFunction.CountA(ZykenRng)
If ZykenSu < 6 Then
MsgBox "置換条件が選択されていません"
Worksheets("置換").Protect Contents:=True, Scenarios:=True, AllowFormattingColumns:=True
Application.EnableEvents = True '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 'Application.ScreenUpdating = True '*************************************
Exit Sub
End If
If Range("A2").Interior.ColorIndex <> 36 Then
On Error Resume Next
Columns(1).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
On Error GoTo 0
End If
Max_row = Sheets("置換").Cells(Rows.Count, 1).End(xlUp).Row
If Max_row = 1 Then
MsgBox "A列に文字がありません"
Exit Sub
End If
col = Range("H1:AA1").Find(What:=Range("F5").Value, LookAt:=xlWhole, MatchCase:=True, MatchByte:=False, LookIn:=xlValues).Column
'
If Range("F8").Value = "区別しない" Then
MC = False
ElseIf Range("F8").Value = "区別する" Then
MC = True
End If
If Range("F11").Value = "区別しない" Then
MB = False
ElseIf Range("F11").Value = "区別する" Then
MB = True
End If
If Range("F14").Value = "変換しない" Then
LA = xlWhole
ElseIf Range("F14").Value = "変換する" Then
LA = xlPart
End If
Max_row = Sheets("置換").Cells(Rows.Count, 2).End(xlUp).Row
If Max_row < 2 Then
Set A_rng = Range("A2", Range("A" & Rows.Count).End(xlUp))
A_rng.Offset(, 1).Value = A_rng.Value
For Each Hyo_rng In Range(Cells(3, col), Cells(65356, col).End(xlUp))
A_rng.Offset(, 1).Replace What:=Hyo_rng.Value, Replacement:=Hyo_rng.Offset(, 1).Value, LookAt:=LA, MatchCase:=MC, MatchByte:=MB
Next
Set A_rng = Nothing
Call 全半大小変換
Else
Set A_rng = Range("B2", Range("B" & Rows.Count).End(xlUp))
For Each Hyo_rng In Range(Cells(3, col), Cells(65356, col).End(xlUp))
A_rng.Replace What:=Hyo_rng.Value, Replacement:=Hyo_rng.Offset(, 1).Value, LookAt:=LA, MatchCase:=MC, MatchByte:=MB
Next
Set A_rng = Nothing
Call 全半大小変換
End If
Max_row = 1
For i = 1 To 2
j = Cells(Rows.Count, i).End(xlUp).Row
If j > Max_row Then
Max_row = j
End If
Next i
Range("A2:B" & Max_row).Select 'A2〜B列最終行まで選択
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideVertical).LineStyle = xlDash
Selection.NumberFormatLocal = "@"
Selection.Interior.ColorIndex = 36
Range("B2:B65356").Select
Selection.Locked = False
Sheets("置換").Protect Contents:=True, Scenarios:=True
Range("B2:B" & Max_row).Copy
Worksheets("置換").Protect Contents:=True, Scenarios:=True, AllowFormattingColumns:=True
Application.EnableEvents = True '★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
Application.ScreenUpdating = True '*************************************
End Sub
Sub 全半大小変換()
Dim セル As Range
Dim B_row As String
Select Case VbULP
Case Range("D5").Value = "大文字変換"
VbULP = vbLowerCase
Case Range("D5").Value = "小文字変換"
VbULP = vbUpperCase
End Select
Select Case VbWN
Case Range("D8").Value = "全角変換"
VbWN = vbNarrow
Case Range("D8").Value = "半角変換"
VbWN = vbWide
End Select
B_row = Cells(Rows.Count, 2).End(xlUp).Address
Range("B2:" & B_row).Select
For Each セル In Selection
If Range("D5").Value = "変換しない" And Range("D8").Value = "変換しない" Then
Exit Sub
ElseIf Range("D5").Value = "変換しない" And Range("D8").Value <> "変換しない" Then
Rplce = StrConv(セル.Value, VbWN)
ElseIf Range("D5").Value <> "変換しない" And Range("D8").Value = "変換しない" Then
Rplce = StrConv(セル.Value, VbULP)
ElseIf Range("D5").Value <> "変換しない" And Range("D8").Value <> "変換しない" Then
Rplce = StrConv(セル.Value, VbULP + VbWN)
End If
セル.Value = Rplce
Next セル
End Sub
Sub 全半大小変換2()
Dim セル As Range
Dim Max_row As Long
Dim Max_rowB As Long
Dim ZyknRng As Range
Dim Zykn As Byte
Dim i As Byte
Dim j As Long
Set ZyknRng = Range("D5,D8")
Zykn = Application.WorksheetFunction.CountA(ZyknRng)
If Zykn < 2 Then
MsgBox "置換条件が選択されていません"
Set ZyknRng = Nothing
Application.ScreenUpdating = False
Application.EnableEvents = False
Worksheets("置換").Protect Contents:=True, Scenarios:=True
Exit Sub
Else
Set ZyknRng = Nothing
End If
Select Case VbULP
Case Range("D5").Value = "大文字変換"
VbULP = vbLowerCase
Case Range("D5").Value = "小文字変換"
VbULP = vbUpperCase
End Select
Select Case VbWN
Case Range("D8").Value = "全角変換"
VbWN = vbNarrow
Case Range("D8").Value = "半角変換"
VbWN = vbWide
End Select
'
If Range("A2").Interior.ColorIndex <> 36 Then
On Error Resume Next
Columns(1).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp
On Error GoTo 0
End If
Max_row = Sheets("置換").Cells(Rows.Count, 1).End(xlUp).Row
If Max_row < 2 Then Exit Sub
Max_rowB = Sheets("置換").Cells(Rows.Count, 2).End(xlUp).Row
If Max_rowB < 2 Then
Range("B2:B" & Max_row).Value = Range("A2:A" & Max_row).Value
End If
Max_row = 1
For i = 1 To 2
j = Cells(Rows.Count, i).End(xlUp).Row
If j > Max_row Then
Max_row = j
End If
Next i
Range("B2:B" & Max_row).Select
For Each セル In Selection
If Range("D5").Value = "変換しない" And Range("D8").Value = "変換しない" Then
Range("A2:B" & Max_row).Select
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideVertical).LineStyle = xlDash
Selection.NumberFormatLocal = "@"
Selection.Interior.ColorIndex = 36
Range("B2:B" & Max_row).Select
Exit Sub
ElseIf Range("D5").Value = "変換しない" And Range("D8").Value <> "変換しない" Then
Rplce = StrConv(セル.Value, VbWN)
ElseIf Range("D5").Value <> "変換しない" And Range("D8").Value = "変換しない" Then
Rplce = StrConv(セル.Value, VbULP)
ElseIf Range("D5").Value <> "変換しない" And Range("D8").Value <> "変換しない" Then
Rplce = StrConv(セル.Value, VbULP + VbWN)
End If
セル.Value = Rplce
Next セル
Range("A2:B" & Max_row).Select
Selection.Borders.LineStyle = xlContinuous
Selection.Borders(xlInsideVertical).LineStyle = xlDash
Selection.NumberFormatLocal = "@"
Selection.Interior.ColorIndex = 36
Range("A2:A65356").Select
Selection.Locked = False
Range("B2:B" & Max_row).Select
End Sub
はり忘れていたAuto_Close
Sub Auto_Close()
Dim Max_row As Long
Sheets("置換").Select
'
Max_row = Sheets("置換").Cells(Rows.Count, 1).End(xlUp).Row
If Max_row < 2 Then
Call jwwデータ取得
End If
'
Max_row = Sheets("置換").Cells(Rows.Count, 2).End(xlUp).Row
If Max_row < 2 Then
Call 変換
Else
Application.CutCopyMode = False
Range("B2:B" & Max_row).Copy
End If
Call 変換データ記入
Application.DisplayAlerts = False '問い合せダイアログの表示をOFF
Workbooks("複数同時置換.xls").Close SaveChanges:=False '上書きせずに保存
Application.DisplayAlerts = True '問い合せダイアログの表示をON
End Sub
Indexへ
(33170)← 【33175】→(33177) ------------------------ 【タイトル】削除の場合
【記事番号】 33175 (33170 )
【 日時 】09/02/23 22:18
【 発言者 】ai
jwwに文字を戻す際に文字を削除したい(置換後の文字がない)場合の
処理が分からず調べ中です。
配列で格納する際に置換後の文字がない(Null)場合は格納されず置換されないのかなと
なんとなく思っているのですが全般的に理解できておりませんorz
ss = StrConv(InputB(LOF(myFNo), #myFNo), vbUnicode)
http://officetanaka.net/excel/vba/function/StrConv.htm
ss = Left$(ss, Len(ss) - 2)
http://msdn.microsoft.com/ja-jp/library/cc410261.aspx
もしくは
strtemp = Split(ss(i), " ", 6)
http://www.kanaya440.com/contents/script/vbs/function/string/split.html
あたりが関連しているのでしょうか?
半角スペースなり全角スペースなりいれれば削除できますが、
図面内にスペースだけの文字が増えてしまいますし避けたいです。
削除する場合も考えて下記部分はA列とB列の最終行で大きいほうを
LastRowにすればいいのかなと思っています。
あっていますでしょうか?
With Sheet1
LastRow = .Range("B" & .Rows.Count).End(xlUp).Row
If LastRow < 2 Then Exit Sub
案1
LastA = .Range("A" & .Rows.Count).End(xlUp).Row
LastB = .Range("B" & .Rows.Count).End(xlUp).Row
IF LastA > LastB Then
LastRow = LastA
Else
LastRow = LastB
End If
案2
Dim i As Byte
Dim j As Byte
LastRow = 1
For i = 1 To 2
j = Cells(Rows.Count, i).End(xlUp).Row
If j > Last_row Then
LastRow = j
End If
Next i
いっちさんが書いてくださった元のコード
http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=33137;id=004
Indexへ
(33175)← 【33177】→(33179) ------------------------ 【タイトル】Re(1):削除の場合
【記事番号】 33177 (33175 )
【 日時 】09/02/24 00:25
【 発言者 】いっち
▼aiさん:
下記のように修正しました。
尚、動作させていて気がついたのですが、
外部変形実行中、上書き保存をしてしまうと、
次回、実行時にその文字が残ってしまいます。
(上書き保存する必要の無いコードではありますけど。)
そのため、変更前の文字を書き出す前の処理として、
前回の文字を消去するコードを加えておいてください。
(これについては、もうお気づきかもしれませんけど。)
------------------------------------------------------------------------------
↓こういうことですか。
Sub myFileOutput()
'Jw_cadへ戻す
'変更するもののみ、B2セルから下に書き出しておけば問題なし。
'(↑変更前と変更後は、横に並べて書いてください。)
Dim myFile As String, strtemp() As String
Dim myFNo As Integer
Dim v As Variant, ss As Variant
Dim strOutput() As String
Dim i As Long, j As Long, k As Long
Dim LastRow As Long
myFile = ThisWorkbook.Path & Application.PathSeparator & "JWC_TEMP.TXT"
myFNo = FreeFile
Open myFile For Input As #myFNo
ss = StrConv(InputB(LOF(myFNo), #myFNo), vbUnicode)
Close #myFNo
While Right$(ss, 2) = vbCrLf
ss = Left$(ss, Len(ss) - 2)
Wend
ss = Split(ss, vbCrLf)
With Sheet1
LastRow = .Range("B" & .Rows.Count).End(xlUp).Row
If LastRow < 2 Then Exit Sub
With .Range(.Range("B2"), .Range("B" & LastRow))
If LastRow = 2 Then
ReDim v(1 To 1, 1 To 1)
v(1, 1) = .Value
Else
v = .Value
End If
End With
End With
ReDim strOutput(UBound(ss))
For i = 0 To UBound(ss)
Select Case True
Case ss(i) Like "c[hvs]*"
j = j + 1
If j <= UBound(v, 1) Then
If Len(v(j, 1)) > 0 Then
k = k + 1
strtemp = Split(ss(i), " ", 6)
strtemp(5) = Left$(strtemp(5), 1) & v(j, 1)
strOutput(k) = Join(strtemp)
End If
End If
Case ss(i) = "hq"
strOutput(k) = "hd"
Case Else
k = k + 1
strOutput(k) = ss(i)
End Select
Next
ReDim Preserve strOutput(k)
myFNo = FreeFile
Open myFile For Output As #myFNo
Print #myFNo, Join(strOutput, vbCrLf)
Close #myFNo
ThisWorkbook.Saved = True
Application.Quit
End Sub
Indexへ
(33177)← 【33179】→(33180) ------------------------ 【タイトル】Re(2):削除の場合
【記事番号】 33179 (33177 )
【 日時 】09/02/24 00:52
【 発言者 】いっち
▼aiさん:
下記をご考慮ください。
Sub myFileInput()
'始めの読み込み
With Sheet1
With .Range("A2").Resize(UBound(v, 1), 1)
.ClearContents
↑これは、新たに書き出す部分しか消去していません。
書き出す前に、前回の不要な文字が残っていたら
それらを削除するコードをどこかで加えてあれば、
このClearContentsはいらないです。
このClearContentsの意味するところは、
セルに何も入力していない状態の方が
書き出し処理が早くなるためです。
.Value = v
↑ここで変更前を書き出しています。
End With
.Columns.Item("A:A").AutoFit
↑もし、これが無い方がよろしければ、削除してください。
End With
Indexへ
(33179)← 【33180】→(33181) ------------------------ 【タイトル】Re(2):削除の場合
【記事番号】 33180 (33177 )
【 日時 】09/02/24 01:01
【 発言者 】sugi
sugiです。みなさん、こんにちは。
いっちさん wrote:
> 尚、動作させていて気がついたのですが、
> 外部変形実行中、上書き保存をしてしまうと、
> 次回、実行時にその文字が残ってしまいます。
> (上書き保存する必要の無いコードではありますけど。)
この辺、私もちょっと気になってました。
オリジナルを残しておいて、外部変形のバッチファイルでコピーし
たエクセルファイルを変更し上書き保存という方法もありかと思い
ます。
ruby 版は現在クリップボードから置換後の文字を取り出してます
が、上書きされたエクセルファイルがあればそちらからでも置換後
の文字を取りだすことができるようになって、ちょっと嬉しかった
りします。:-)
--
sugi
Indexへ
(33180)← 【33181】→(33184) ------------------------ 【タイトル】Re(3):削除の場合
【記事番号】 33181 (33180 )
【 日時 】09/02/24 08:25
【 発言者 】いっち
sugiさん、aiさん
おはようございます。
>上書きされたエクセルファイルがあればそちらからでも置換後
>の文字を取りだすことができるようになって、ちょっと嬉しかった
>りします。:-)
新たに書き出す前に削除すれば、上書きしても問題ないと思います。
・・・aiさんは、もうデータ削除のコードを作っておられるような
気がします。
>Private Sub Workbook_Open()
> Call データ削除
> Call jwwデータ取得
>End Sub
Indexへ
(33181)← 【33184】→(33185) ------------------------ 【タイトル】Re(4):削除の場合
【記事番号】 33184 (33181 )
【 日時 】09/02/24 10:08
【 発言者 】ai
▼sugiさん:
▼いっちさん:
おはようございます、いろいろありがとうございます。
▼sugiさん:
教えていただいたコードをエクセル側をいじって試しているのですが、
未だ書き戻しが上手くいかない原因がつかめておりません。
コードが邪魔しているのかと思いブック名とシート名を合わせた
新ブックを作ってA列に書きこまれた文字をB列にコピーし文字を変えてB列に変換し、
B列コピーしてエクセル終了なども試したのですが書き込みが上手くいきません。
申し訳ありません。
▼いっちさん:
>・・・aiさんは、もうデータ削除のコードを作っておられるような
>気がします。
あれからいっちさんの文字取得のコードの中にAB列データ削除のコードも組み込みました。
(データ取得の際はAB列は常にまっさらにしておきたいと思ったので)
同じ設定でさくさく置換したい際にそのほうが楽かなと思い今のとこ
ワークブックが開いた際にはセル全削除して文字だけ取得する状態にしています。
データ残したいと思ったらWorkbook_Openのコード消して、
データ取得をシートに設置しているボタンのみで行う様にかえるかもしれません。
(その際はAuto_Closeの際は上書きせずに保存になるようにしてるので上書き保存に
変える必要があると思いますが)
また、1回置換したらセルが付くようにして、セルに色が付いているかどうかで空白行削除を
かけるかかけないかの判断にしてます。
置換方法を間違えた際はjwwデータ取得ボタンを作っていてそれを再度押したら
AB列データを削除して再度JWC_TEMP.TEXTからデータ取得しなおすようにしています。
文字ずれを起こすjwwデータが手元にないので空白行削除をかける
必要があるのかないのかは未だに分かっておりません。
データの書き戻しはどのシートからもJWC_TEMP.TEXT書き込みして閉じれる&
データの書き戻しは間違わないように最後にだけ行いたいと思って
Auto Closeの際に行うようにしているのでjwwのデータ再取得の場合のミスはないと思います。
> .Columns.Item("A:A").AutoFit
> ↑もし、これが無い方がよろしければ、削除してください。
これに関しては消させていただいて
Sub 列幅設定()
Range("A:B").Select
If Selection.ColumnWidth = 10 Then
Selection.Columns.AutoFit
Else
Selection.ColumnWidth = 10
End If
Range("C1").Select
End Sub
を設定したボタン付けさせていただきました。
(列の中身を見たい場合とみなくていい場合とがあるので)
下記訂正
置換後の文字がNULLの場合の対応ですが書き戻しコードの
If Len(v(j, 1)) > 0 Then を
If Len(v(j, 1)) = 0 Then で動作している気がするので
そちらに改変させていただいてます。
先に変換作業をして結果をB列に出している場合は上手くいくのですが、
Auto_Closeの際に同時に変換&書き込みをしようとすると
変換が上手くいかないようです、原因がまだ分かりません。
アップリケーションかカウントイフが使えないのと関連しているんでしょうか?
Indexへ
(33184)← 【33185】→(33197) ------------------------ 【タイトル】Re(5):削除の場合
【記事番号】 33185 (33184 )
【 日時 】09/02/24 10:25
【 発言者 】ai
置換の件は勘違いでした。
以前置換の際はA列のデータを置換規則に基づいてB列に置換させていたので
表1指定して置換した後、表2を指定して置換という場合は
B列のデータをA列に張って置換していたのですが、
今回元データは常にA列、置換1回目はA列の文字を置換しB列へ記入、
2回目以降はB列のデータをB列に置換して書き込むという風に変更したのですが、
それに合わせてAuto_closeのデータを変更するのを忘れていました。
Sub Auto_Close()
Dim Max_row As Long
Sheets("置換").Select
'
Max_row = Sheets("置換").Cells(Rows.Count, 1).End(xlUp).Row
If Max_row < 2 Then
Call jwwデータ取得
Call 変換
Else
Call 変換
End If
Call 変換データ記入
Application.DisplayAlerts = False '問い合せダイアログの表示をOFF
Workbooks("複数同時置換.xls").Close SaveChanges:=False '上書きせずに保存
Application.DisplayAlerts = True '問い合せダイアログの表示をON
End Sub
に変更で自分の希望動作は完璧にこなしてくれるものになりました。
Indexへ
(33185)← 【33197】→(33203) ------------------------ 【タイトル】Re(6):削除の場合
【記事番号】 33197 (33185 )
【 日時 】09/02/24 15:19
【 発言者 】いっち
▼aiさん:
>に変更で自分の希望動作は完璧にこなしてくれるものになりました。
良かったですね。
ダウンロード可能になったら、
また、ダウンロードさせて頂きますね。
Indexへ
(33197)← 【33203】→(33122) ------------------------ 【タイトル】【報告】いっちさんのコード利用の完成データ
【記事番号】 33203 (33197 )
【 日時 】09/02/24 17:44
【 発言者 】ai
いっちさんのコードを使ったエクセルの置換データの完成品できたので掲示板にあげました。
皆様ありがとうございます。
利用して試しては見たのですがまだあまり利用していないのでミスコードなどもあるかもしれません。
http://ohayou-oyasumi.webdeki-bbs.com/
Indexへ
(33203)← 【33122】→(33123) ------------------------ 【タイトル】Re(3):エクセル置換のマクロ訂正予定です
【記事番号】 33122 (33116 )
【 日時 】09/02/21 14:39
【 発言者 】sugi
sugiです。aiさん、こんにちは。
外部変形でやろうと思うと次のような手順になると思います。
1.外部変形から編集する文字を取り出す。
2.EXCELを起動し、セルに文字を貼り付け。
3.EXCELのマクロで文字列の置換。
4.置換した文字を jww に書き戻す。
私は ruby が好きなので ruby で書いてみました。よろしければ、
これを叩き台にして自由に変更してみて下さい。例によって全角空
白を半角に変更して利用して下さい。また、ai さん作の「複数同
時置換.xls」をバッチファイルと同じフォルダにコピーしておいて
下さい。
=== EXCEL置換.bat (ここから) ===
@REM EXCEL置換
@echo off
REM #jww
REM #cd
REM #zc
REM #bz
REM #h3
REM #hc【EXCEL置換】変更する範囲を選択
REM #zz
REM #e
copy jwc_temp.txt jwc_temp.bak
ruby -x %~f0 excel_start
ruby -x %~f0 excel_end
rem pause
goto END
#!ruby -Ks
$stderr=open("error.log","w")
require 'win32ole'
def excel_start
excel = WIN32OLE.new('Excel.Application')
excel.visible = true
WIN32OLE.const_load( excel )
txt=[]
open("jwc_temp.bak").each{|tmp|
if /^(c[hvsroptkz2][^\"]*\")(.*)/=~tmp
txt<<$2
end}
book=excel.workbooks.
open(File.expand_path("./複数同時置換.xls"))
sheet = book.worksheets.item("置換")
txt.each_with_index{|t,i|
sheet.cells.item(2+i,1).value=t}
end
def excel_end
require "Win32API"
require "win32/clipboard"
sleep 3
wsh = WIN32OLE.new('WScript.Shell')
ans=wsh.Popup("実行します",0, "置換実行",4)
clip=Win32::Clipboard.data
$stdout=open("jwc_temp.txt","w")
exit 0 if ans==7
clip=clip ? clip.split("\r\n") : ""
i=0
open("jwc_temp.bak").each{|tmp|
case tmp
when /hq/
puts "hd"
when /^(c[hvsroptkz2][^\"]*\")(.*)/
if clip[i]
puts $1+clip[i]
i+=1
else
print tmp
end
else
print tmp
end}
puts "h# #{i} 個の文字を処理しました"
end
if ARGV.include?("excel_start")
excel_start
elsif ARGV.include?("excel_end")
excel_end
end
__END__
:END
=== EXCEL置換.bat (ここまで) ===
詳しくは検索で調べてもらうとして、一応、少しだけ解説。^^;
aiさんの EXCEL のマクロでは置換した文字列を一旦コピーしてい
るので、置換した文字を jww に書き戻す際にはクリップボードを
経由させるようにしてみました。そのためクリップボードに他の文
字が入っていたりすると動作がおかしくなります。
aiさん wrote(#33111):
> JWC_TEMP.TXTファイルに文字情報だけ抜き出す(jwwは待機状態にしておく?)
> 作業はVBSでするということでしょうか?
わたしもこの辺でつまずきました。
EXCEL のマクロで文字の置換を実行した後、待機させていたスクリ
プトを再開させるようにしたかったのですが、どういう風に処理し
てよいのか分からず、苦肉の策でメッセージボックスを表示させて
入力待ちの状態にしてます。そのためクリップボードへコピーする
前に「置換実行」- 「YES」としても、やはりおかしな動作をしま
すし、メッセージボックス自体も邪魔になりますが我慢して下さい。
この辺、もう少しスマートに行なう方法があれば教えて下さい。> ALL
--
sugi
Indexへ
(33122)← 【33123】→(33125) ------------------------ 【タイトル】Re(4):エクセル置換のマクロ訂正予定です
【記事番号】 33123 (33122 )
【 日時 】09/02/21 17:58
【 発言者 】mirror
▼sugiさん:
>>この辺、もう少しスマートに行なう方法があれば教えて下さい。> ALL
エクセルではありませんが、OpenOffice.org Calcで
外部変形機能から、jwwの作図領域の点を指示していき
点指示終了後に、部材文字列の入ったリストから部材文字列を選択して
jwwの作図領域から抽出した点位置情報から長さを計算して部材文字列に追加し
jww作図領域に書き戻すようなマクロを組んだ事があります。
以下は、その呼出のbatファイルです。
@rem 部材文字列+測定長文字列
REM #jw
REM #cd
REM #0 結果の書込み位置指定
REM #1-
REM #2-
REM #3-
REM #4-
REM #10#
REM #hr
REM #e
start /w soffice macro:///test.jw.soku("")
echo on
REM 終了
外部変形からjww作図領域の文字列置換・枠囲み・連番等を処理するものも
OpenOffice.org Calcで作成した経験が有りますので
恐らく、エクセルvbsでも同様な呼出方法で可能だろうと思います。
目的とする作業にあわせて
表計算が簡潔である場合は、表計算に実装されているインタープリタで行えば
それ程、問題にはならないと思います。
それにしても、OpenOffice.org Calcとか皆さん使ってないのかな?
他のインタープリタで作成された外部変形と同等のものも作成できるのですが・・・
Indexへ
(33123)← 【33125】→(33131) ------------------------ 【タイトル】Re(5):エクセル置換のマクロ訂正予定です
【記事番号】 33125 (33123 )
【 日時 】09/02/21 21:54
【 発言者 】sugi
sugiです。みなさん、こんにちは。
mirrorさん wrote:
> エクセルではありませんが、OpenOffice.org Calcで
>
> 外部変形機能から、jwwの作図領域の点を指示していき
> 点指示終了後に、部材文字列の入ったリストから部材文字列を選択して
> jwwの作図領域から抽出した点位置情報から長さを計算して部材文字列に追加し
> jww作図領域に書き戻すようなマクロを組んだ事があります。
> 以下は、その呼出のbatファイルです。
(snip)
> start /w soffice macro:///test.jw.soku("")
> echo on
> REM 終了
start /w での起動だと、プログラムの終了を待って次のコマンド
に移るはずなので、これで良さそうな気がするのですが、実際は
start /w ruby -x %~f0 excel_start
ruby -x %~f0 excel_end
という風に変更してみてもうまくいかないのです。
ruby からエクセルを開いた後、エクセルの終了を待たずに ruby
のスクリプトが終了してしまうようで、多分これは VBSからエクセ
ルを利用した場合も同じだと思います。
ruby からエクセルを利用する外部変形といえば、うしわたりさん
の ghelon や eTable が有名です。今回、なにか参考にならないか
と見直してみたのですが、ghelon は外部変形の結果を エクセル
に書き出すだけでマクロとの連携はしてないですし、eTable はマ
クロを利用しているのですが、実行ファイルが exe 形式で固めて
あって、お手軽なスクリプトで真似するという訳にはいかなさそう。
エクセルのマクロと連携させた外部変形って、意外と難しそうと思っ
てたらこの発言。
aiさん wrote(#33124):
> バッチ側に
> start Excel.exe C:\jww\文字\複数同時置換.xls
> を加えてエクセル側のマクロを
> Private Sub Workbook_Open()
> に変えて自動実行できました。
ruby からエクセルを起動してワークシートを操作した後、マクロ
と連携させてと考えていてハマったのですが、こういう風に直接エ
クセルを起動して、マクロ側で直接置換する文字列の取り込みまで
できれば、おそらくこの問題はクリアできそうです。
aiさん wrote(#33124):
> 書き戻す方法は文字の位置情報とか色情報とかレイヤ情報は残し
> たままで文字部分だけをTEXTファイルに書き戻してそれをjww
> で読み込むのかと思ってるのですが、数III、数Cで完全挫折し
> て赤点とったような頭なので記述が難しそうでできる自信はあま
> りないですorz
この部分は置換前の文字を拾って、置換後の文字に差し替えてくだ
けなので、それほど難しくはないと思います。
# 少なくとも ruby でやる分には。:-)
--
sugi
Indexへ
(33125)← 【33131】→(33136) ------------------------ 【タイトル】Re(6):エクセル置換のマクロ訂正予定です
【記事番号】 33131 (33125 )
【 日時 】09/02/21 23:20
【 発言者 】ai nekobasu83@yahoo.co.jp
▼sugiさん:
内容がまだ全然理解できていないのでしばらく調べてみます。
前回いただいたbatファイル眺めて返信書きながら内容調べてたりする間に
発言前後してしまいました、すみません。
>置換前の文字を拾って、置換後の文字に差し替えてくだ
>けなので、それほど難しくはないと思います。
答えそっくりそのまんまいただいてしまっていてありがとうございます&
申し訳ありません、理解して自分でもできるようにがんばってみます。
Indexへ
(33131)← 【33136】→(33142) ------------------------ 【タイトル】インタープリタの起動
【記事番号】 33136 (33125 )
【 日時 】09/02/22 09:15
【 発言者 】mirror
▼sugiさん:
>>直接エクセルを起動して、マクロ側で直接置換する文字列の取り込みまで・・・
いっちさんが紹介してくれているように
jwwの外部変形から呼出すのは、エクセルvbsというインタープリタです
>>3.jw_cadの外部変形から、excelを開きます。
>> 但し、batファイルから、いきなりexcelブックを開くのではなく、
>> vbsファイルを経由させます。
同様に、OpenOffice.org Calcでも
start /w soffice macro:///test.jw.soku("")
等のようにして、直接インタープリタを起動して実行しています。
表計算のインタープリタだからと言って、表計算のsheetが開くわけではありません
必要であれば開けるという事であって、不要である場合はsilentbootします。
又、OSの環境変数を参照するので、パスは気にしなくても良いと云う事であり
勿論、マクロに起動オプションを指定して実行する事も可能です。
Indexへ
(33136)← 【33142】→(33143) ------------------------ 【タイトル】Re(1):インタープリタの起動
【記事番号】 33142 (33136 )
【 日時 】09/02/22 11:56
【 発言者 】mirror
スレが深くなって申し訳無いのですが。
いっちさんから、vbでのコードが紹介されたようなので
ついでといってはあれですが、OpenOffice.org Calc(正確には、OOoBasic)での
jww外部変形機能との連携方法を記述してみます。
-------------------------------------------------------------------------
Sub soku 'jwwに部材文字列+測定値挿入
dim sten(20,4)
'jww外部変形から点座標受取
fno = Freefile
Open "e:\xxx\jwc_temp.txt" For Input As fno
dno = 1
While not eof(fno)
Line Input #fno,dline
if left(dline,2) = "hp" then ten() = split(dline) : sten(dno,1) = ten(2) : sten(dno,2) = ten(3) : dno = dno+1
Wend
Close #fno
'点座標から長さ算出
for cou1 = 1 to dno - 2
tx1 = val(sten(cou1,1)) : ty1 = val(sten(cou1,2))
tx2 = val(sten(cou1+1,1)) : ty2 = val(sten(cou1+1,2))
lin = int((((tx2-tx1)^2+(ty2-ty1)^2)^(1/2))/10+0.5)/100
kei = kei + lin
next cou1
'リストから文字列選択(別プロシージャ呼出・今回は省略)
'dlgload
'list2
'list3
'jwwにデータを返す
fno = Freefile
Open "e:\xxx\jwc_temp.txt" For output As fno
Print #fno,"ch 0 0 2000 0 """+buzai3+kei
Close #fno
end sub
--------------------------------------------------------------------------
上記のコードは、表計算のsheetをまったく開かないで行っています。
vbと違い、OOoBasicでは大概の変数を宣言しなくても動作します。(良し悪しですが)
要は
jww外部変形からデータを受け取り
処理して
jwwにデータを返す・・・という事でした。
Indexへ
(33142)← 【33143】→(33145) ------------------------ 【タイトル】Re(1):インタープリタの起動
【記事番号】 33143 (33136 )
【 日時 】09/02/22 13:42
【 発言者 】sugi
sugiです。みなさん、こんにちは。
mirrorさん wrote:
> いっちさんが紹介してくれているように
> jwwの外部変形から呼出すのは、エクセルvbsというインタープリタです
いっちさんが紹介してくれているスクリプトはエクセルのマクロで
すね。先の外部変形のバッチファイルと併用して置換する文字列の
読取り、書出しができることを確認しました。これをaiさんの「複
数同時置換.xls」内のマクロに組込めば aiさんの希望通りの外部
変形が完成すると思います。
mirror さんに私の言いたいことがちゃんと伝わっていたかちょっ
と心配なので一度ちゃんとまとめておきます。今回の外部変形はエ
クセルに書出すだけでなく、エクセルのマクロを使って修正した文
字を取込んで jww の変更まで行なう必要があります。ruby や VBS
からエクセルを起動するとエクセルの終了を待たずにスクリプトが
終了してしまうので書き戻す作業が出きなくて困ったということを
書いたつもりでした。
# エクセルを用いる外部変形でもマクロを用いず ruby や VBS だ
# けで完結する場合は問題ないです。
最初に思いついたのはメッセージボックスを出してスクリプトを中
断させる方法。一応出来るのですが、泥くさくて気に入りませんで
した。
> start /wait Excel.exe C:\jww\文字\複数同時置換.xls
のようにエクセルを直接起動する方法だとエクセルの終了までスク
リプトが待機できるのでこの点は解決できるのですが、いっちさん
の指摘でもあるようにマクロの警告ダイアログがでるなどの問題も
あります。
今回思いついたのはバッチファイルで pause でスクリプトを中断、
待機させる方法。コマンドプロンプトを消すのにひと手間かかりま
すが、シンプルな方法だと思います。
先のスクリプトを修正すると、こんな感じになります。もちろん
VBSでも同じ要領で使えます。
=== EXCEL置換.bat (ここから) ===
@REM EXCEL置換
@echo off
REM #jww
REM #cd
REM #zc
REM #bz
REM #h3
REM #hc【EXCEL置換】変更する範囲を選択
REM #zz
REM #e
copy jwc_temp.txt jwc_temp.bak
ruby -x %~f0 excel_start
pause
ruby -x %~f0 excel_end
rem pause
goto END
#!ruby -Ks
$stderr=open("error.log","w")
require 'win32ole'
def excel_start
excel = WIN32OLE.new('Excel.Application')
excel.visible = true
WIN32OLE.const_load( excel )
txt=[]
open("jwc_temp.bak").each{|tmp|
if /^(c[hvsroptkz2][^\"]*\")(.*)/=~tmp
txt<<$2
end}
book=excel.workbooks.
open(File.expand_path("./複数同時置換.xls"))
sheet = book.worksheets.item("置換")
txt.each_with_index{|t,i|
sheet.cells.item(2+i,1).value=t}
end
def excel_end
require "Win32API"
require "win32/clipboard"
clip=Win32::Clipboard.data
$stdout=open("jwc_temp.txt","w")
clip=clip ? clip.split("\r\n") : ""
i=0
open("jwc_temp.bak").each{|tmp|
case tmp
when /hq/
puts "hd"
when /^(c[hvsroptkz2][^\"]*\")(.*)/
if clip[i]
puts $1+clip[i]
i+=1
else
print tmp
end
else
print tmp
end}
end
if ARGV.include?("excel_start")
excel_start
elsif ARGV.include?("excel_end")
excel_end
end
__END__
:END
=== EXCEL置換.bat (ここまで) ===
--
sugi
Indexへ
(33143)← 【33145】→(33147) ------------------------ 【タイトル】Re(2):インタープリタの起動
【記事番号】 33145 (33143 )
【 日時 】09/02/22 15:11
【 発言者 】LA
▼sugiさん:
こんにちは
月並みな方法ですが、フラグ用のファイルを使って、バッチファイル内でループする というのはどうでしょうか。
バッチコマンドの部分を、以下の様にして、適当なタイミングで、excel側のVBAで、フラグ用のファイル(下の例ではflag1.flg)を作成してやればいいと思います。
あと、そのままループすると、負荷がかかりすぎるんで、検索したところ、ping でwaitをとる方法があったんで、3秒おきにループするようにしてみました。
copy jwc_temp.txt jwc_temp.bak
if exist flag1.flg del flag1.flg
ruby -x %~f0 excel_start
:LOOP
ping locathost -n 3 >null
if not exist flag1.flg goto LOOP
del flag1.flg >null
ruby -x %~f0 excel_end
rem pause
goto END
Indexへ
(33145)← 【33147】→(33148) ------------------------ 【タイトル】Re(2):インタープリタの起動
【記事番号】 33147 (33143 )
【 日時 】09/02/22 17:47
【 発言者 】mirror
▼sugiさん:
何度も申し訳ありません
>>目的とする作業にあわせて
>>表計算が簡潔である場合は、表計算に実装されているインタープリタで行えば
>>それ程、問題にはならないと思います。
つまり、別段rubyに拘る必要は無いですよと云いたかっただけです。
表計算では、sheetからマクロを自動実行も出来ますし
マクロから複数のsheetを開いたり閉じたりも出来ます
後は、作る側(使う側)の要求にあわせて、人それぞれだという事です。
今回のような事例であれば
vbsからsheetを開き、sheetのマクロを実行させる事により完結します。
因みに
>>ruby や VBSからエクセルを起動すると・・・エクセルの終了を待たず
の件ですが
ループを作成し、アプリケーション側からのトリガーを受け取りループを抜ける
ような方法ではどうでしょうか?
無限ループに陥らないように、安全装置は設けておくべきでしょうが。
可能であれば
アプリケーションのインスタンスハンドルか
アプリケーションデータファイルのwindowハンドルを取得して
その存在確認を行う事によりループを抜けるようなものであれば
アプリケーションのマクロ等に左右される事は無くなるでしょう。
勿論
>>pause でスクリプトを中断
するのも、ひとつの有効な手段であると思います。
・・・スレを良く見てみると、他の人も同じ様に考えるのですね・・・・
Indexへ
(33147)← 【33148】→(33149) ------------------------ 【タイトル】Re(3):インタープリタの起動
【記事番号】 33148 (33147 )
【 日時 】09/02/22 19:01
【 発言者 】sugi
sugiです。みなさん、こんにちは。
LA さん wrote:
> 月並みな方法ですが、フラグ用のファイルを使って、バッチファイ
> ル内でループするというのはどうでしょうか。
>
> バッチコマンドの部分を、以下の様にして、適当なタイミングで、
> excel側のVBAで、フラグ用のファイル(下の例ではflag1.flg)を
> 作成してやればいいと思います。
> あと、そのままループすると、負荷がかかりすぎるんで、検索した
> ところ、ping でwaitをとる方法があったんで、3秒おきにループす
> るようにしてみました。
ありがとうございます。
いただいたサンプルで動作確認してみたところ良さそうでした。
mirror さん wrote:
> ループを作成し、アプリケーション側からのトリガーを受け取りループを抜ける
> ような方法ではどうでしょうか?
> 無限ループに陥らないように、安全装置は設けておくべきでしょうが。
>
> 可能であれば
> アプリケーションのインスタンスハンドルか
> アプリケーションデータファイルのwindowハンドルを取得して
> その存在確認を行う事によりループを抜けるようなものであれば
> アプリケーションのマクロ等に左右される事は無くなるでしょう。
いろいろな方法がありそうですね。
文字列の置換のスクリプトで window ハンドルの取得まで行なうの
はちょっと大掛かりな気がしますが、これもひとつの方法だと思い
ます。
お二人の発言で思いついたのが、ファイルを二重にオープンしよう
としたときにでるエラーを利用する方法。エラーの出ているあいだ
はループさせて、エクセルファイルが閉じられたらループを抜けて
処理を続けるものです。
実際作ってみて確認しましたが、最初に考えていた通りの動作にな
りました。^^v
=== EXCEL置換.bat (ここから) ===
@REM EXCEL置換
@echo off
REM #jww
REM #cd
REM #zc
REM #bz
REM #h3
REM #hc【EXCEL置換】変更する範囲を選択
REM #zz
REM #e
copy jwc_temp.txt jwc_temp.bak
ruby -x %~f0 excel_start
ruby -x %~f0 excel_end
rem pause
goto END
#!ruby -Ks
$stderr=open("error.log","w")
require 'win32ole'
def excel_start
excel = WIN32OLE.new('Excel.Application')
excel.visible = true
WIN32OLE.const_load( excel )
txt=[]
open("jwc_temp.bak").each{|tmp|
if /^(c[hvsroptkz2][^\"]*\")(.*)/=~tmp
txt<<$2
end}
book=excel.workbooks.
open(File.expand_path("./複数同時置換.xls"))
sheet = book.worksheets.item("置換")
txt.each_with_index{|t,i|
sheet.cells.item(2+i,1).value=t}
end
def excel_end
require "Win32API"
require "win32/clipboard"
sleep 1
xls=File.expand_path("./複数同時置換.xls")
while true
begin
open(xls,"a"){|x|}
break
rescue Errno::EACCES
sleep 0.5
end
end
clip=Win32::Clipboard.data
$stdout=open("jwc_temp.txt","w")
clip=clip ? clip.split("\r\n") : ""
i=0
open("jwc_temp.bak").each{|tmp|
case tmp
when /hq/
puts "hd"
when /^(c[hvsroptkz2][^\"]*\")(.*)/
if clip[i]
puts $1+clip[i]
i+=1
else
print tmp
end
else
print tmp
end}
end
if ARGV.include?("excel_start")
excel_start
elsif ARGV.include?("excel_end")
excel_end
end
__END__
:END
=== EXCEL置換.bat (ここまで) ===
--
sugi
Indexへ
(33148)← 【33149】→(33157) ------------------------ 【タイトル】Re(4):インタープリタの起動
【記事番号】 33149 (33148 )
【 日時 】09/02/22 21:34
【 発言者 】sugi
sugiです。みなさん、こんにちは。
落ち着いてスクリプトを読み返すと、もっと簡単にできますね。
試行錯誤の跡を削ってシンプルにしたものを貼っておきます。^^;
=== EXCEL置換.bat (ここから) ===
@REM EXCEL置換
@echo off
REM #jww
REM #cd
REM #zc
REM #bz
REM #h3
REM #hc【EXCEL置換】変更する範囲を選択
REM #zz
REM #e
copy jwc_temp.txt jwc_temp.bak
ruby -x %~f0
rem pause
goto END
#!ruby -Ks
$stderr=open("error.log","w")
$stdout=open("jwc_temp.txt","w")
require "win32ole"
require "Win32API"
require "win32/clipboard"
excel = WIN32OLE.new('Excel.Application')
excel.visible = true
WIN32OLE.const_load( excel )
txt=[]
open("jwc_temp.bak").each{|tmp|
if /^(c[hvsroptkz2][^\"]*\")(.*)/=~tmp
txt<<$2
end}
xls=File.expand_path("./複数同時置換.xls")
book=excel.workbooks.open(xls)
sheet = book.worksheets.item("置換")
txt.each_with_index{|t,i|
sheet.cells.item(2+i,1).value=t}
while 1
begin
open(xls,"a"){|x|}
break
rescue Errno::EACCES
sleep 0.5
end
end
clip=Win32::Clipboard.data
clip=clip ? clip.split("\r\n") : ""
i=0
open("jwc_temp.bak").each{|tmp|
case tmp
when /hq/
puts "hd"
when /^(c[hvsroptkz2][^\"]*\")(.*)/
if clip[i]
puts $1+clip[i]
i+=1
else
print tmp
end
else
print tmp
end}
__END__
:END
=== EXCEL置換.bat (ここまで) ===
--
sugi
Indexへ
(33149)← 【33157】→(33176) ------------------------ 【タイトル】Re(5):インタープリタの起動
【記事番号】 33157 (33149 )
【 日時 】09/02/23 14:39
【 発言者 】ai
▼sugiさん:
まだ上手く動作させれなくて調べ中です、また何かの勘違いだとは思うのですが。
もうしばらくお時間ください。
Indexへ
(33157)← 【33176】→(33178) ------------------------ 【タイトル】Re(6):インタープリタの起動
【記事番号】 33176 (33157 )
【 日時 】09/02/24 00:17
【 発言者 】sugi
sheet.cells.
Indexへ
(33176)← 【33178】→(33191) ------------------------ 【タイトル】Re(6):インタープリタの起動
【記事番号】 33178 (33157 )
【 日時 】09/02/24 00:39
【 発言者 】sugi
sugi です。
スクリプト中の文字がなぜか掲示板の禁止語句にひっかかって、調
べてるうちに変なものを送ってしまいました。すいません。
aiさん、こんにちは。展開が速すぎてついていけません。orz
ai さん wrote:
> まだ上手く動作させれなくて調べ中です、また何かの勘違いだと
> は思うのですが。もうしばらくお時間ください。
どの辺でつまずいているのでしょうか?
「error.log」にエラーを書き出すようにしているのですが、こち
らになにかエラーはでていますか?
1個所間違いに気が付いたので、修正版をアップしておきます。つ
いでに「変換」マクロも実行するようにしてみました。禁止語句に
ひっかかるのでエンコードしてます。「EXCEL置換.bat.txt」を
「decode.bat」にドラッグアンドドロップして下さい。
=== decode.bat (ここから) ===
ruby -Ks -x %~f0 %1 %2 %3 %4 %5 %6 %7 %8 %9
exit
#! ruby
$stderr=open(File.dirname(ARGV[0])+'\error.log',"w")
ARGV.each{|argv|
unless FileTest.file?(argv.sub(/\.te?xt$/i,""))
open(argv.sub(/\.te?xt$/i,""),"wb"){|e|
e.print open(argv).read.unpack("m")}
end}
=== decode.bat (ここまで) ===
=== EXCEL置換.bat.txt (ここから) ===
QFJFTSBFWENFTJJ1ircNCkBlY2hvIG9mZg0KUkVNICNqd3cNClJFTSAjY2QN
ClJFTSAjemMNClJFTSAjYnoNClJFTSAjaDMNClJFTSAjaGOBeUVYQ0VMknWK
t4F6lc+NWIK3gumUzYjNgvCRSZHwDQpSRU0gI3p6DQpSRU0gI2UNCg0KY29w
eSBqd2NfdGVtcC50eHQgandjX3RlbXAuYmFrDQpydWJ5IC14ICV+ZjANCnJl
bSBwYXVzZQ0KZ290byBFTkQNCg0KIyFydWJ5IC1Lcw0KDQokc3RkZXJyPW9w
ZW4oImVycm9yLmxvZyIsInciKQ0KJHN0ZG91dD1vcGVuKCJqd2NfdGVtcC50
eHQiLCJ3IikNCg0KcmVxdWlyZSAid2luMzJvbGUiDQpyZXF1aXJlICJXaW4z
MkFQSSINCnJlcXVpcmUgIndpbjMyL2NsaXBib2FyZCINCg0KZXhjZWwgPSBX
SU4zMk9MRS5uZXcoJ0V4Y2VsLkFwcGxpY2F0aW9uJykNCmV4Y2VsLnZpc2li
bGU9dHJ1ZQ0KV0lOMzJPTEUuY29uc3RfbG9hZChleGNlbCkNCnhscz1GaWxl
LmV4cGFuZF9wYXRoKCIuL5WhkJSTr46eknWKty54bHMiKQ0KYm9vaz1leGNl
bC53b3JrYm9va3Mub3Blbih4bHMpDQpzaGVldD1ib29rLndvcmtzaGVldHMu
aXRlbSgiknWKtyIpDQoNCm9wZW4oImp3Y190ZW1wLmJhayIpLnJlYWQuDQog
IHNjYW4oL15jW15jaW5dW15cIl0qXCIoLiopLykuDQogIGZsYXR0ZW4uZWFj
aF93aXRoX2luZGV4e3x0LGl8DQogIHNoZWV0LmNlbGxzLml0ZW0oMitpLDEp
LnZhbHVlPXR9DQoNCiMgg32DToONjsCNcw0KZXhjZWwucnVuKCKVz4q3IikN
CnNoZWV0LmNlbGxzLml0ZW0oMiwyKS5zZWxlY3QNCg0KYmVnaW4NCiAgb3Bl
bih4bHMsImEiKQ0KcmVzY3VlIEVycm5vOjpFQUNDRVMNCiAgc2xlZXAgMC41
DQogIHJldHJ5DQplbmQNCg0KY2xpcCxpPVdpbjMyOjpDbGlwYm9hcmQuZGF0
YSwwDQpjbGlwPWNsaXAgPyBjbGlwLnNwbGl0KCJcclxuIikgOiAiIg0Kb3Bl
bigiandjX3RlbXAuYmFrIikuZWFjaHt8dG1wfA0KICBpZiAvXmhxLz1+dG1w
DQogICAgcHV0cyAiaGQiDQogIGVsc2lmIC9eKGNbXmNpbl1bXlwiXSpcIiko
LiopLz1+dG1wICYmIGNsaXBbaV0NCiAgICBwdXRzICQxK2NsaXBbaV0NCiAg
ICBpKz0xDQogIGVsc2UNCiAgICBwcmludCB0bXANCiAgZW5kfQ0KDQpfX0VO
RF9fDQo6RU5EDQo=
=== EXCEL置換.bat.txt (ここまで) ===
ai さん wrote(#33162):
> あとbatファイルの
> >start /wait Excel.exe C:\jww\文字\複数同時置換.xls
> は自動でパスを通す方法を探し中です。
バッチファイルに「REM #cd」の記述があって、バッチファイルと
同じフォルダに「複数同時置換.xls」が置いてあれば別にフルパス
で書かなくても
start /w Excel.exe 複数同時置換.xls
で動作すると思うのですが、そういうことでは無いですか?
ai さん wrote(#33175):
> 文字を削除したい(置換後の文字がない)場合の処理が分からず
> 調べ中です。
ちなみに ruby 版だと置換後の文字がない場合は文字が消えてしま
いました。
どこまでがクリアできて、どこが未解決なのかが分からなくなって
きたので、アドバイスをつけにくくなってきました。きりの良いと
ころでエクセルのファイルをアップしてもらい、改めて未解決点を
質問されると回答もしやすくなると思います。
--
sugi
Indexへ
(33178)← 【33191】→(33196) ------------------------ 【タイトル】Re(7):インタープリタの起動
【記事番号】 33191 (33178 )
【 日時 】09/02/24 11:48
【 発言者 】ai
▼sugiさん:
いつも丁寧にありがとうございます。
コピーしてNOTEPADに貼り付け全角を半角に変換をかけてEXCEL置換.bat.textとdecode.batという名前で保存し、
EXCEL置換.bat.textをdecode.batにドラックしたのですが、その時点で失敗してしまいます。
エラー表示はC¥DISKtop〜のようなアドレスが並んでます。
以前教えて頂いたデータはRuby KSと記述がありましたし、
動作環境はそろっていると思うのですが未だよく分かりません。
訂正データが使えていないので訂正前の場合ですが、
B列をコピーしエクセルを保存せずに閉じた際に、
「1個のファイルをコピーしました。
続行するには何かキーを押してください。」
とでてエンターを押すとエクセル画面上部に灰色のちいさな長方形がでて
(外部変形実行した場合にコメントが出る位置)
外部変形再選択の画面になってしまいます。
>バッチファイルに「REM #cd」の記述があって、バッチファイルと
>同じフォルダに「複数同時置換.xls」が置いてあれば別にフルパスで書かなくても
>start /w Excel.exe 複数同時置換.xls
>で動作すると思うのですが、そういうことでは無いですか?
動作しました、ありがとうございます。
勘違いして余計なコード書き込んでいたようです、指摘ありがとうございます。
>ちなみに ruby 版だと置換後の文字がない場合は文字が消えてしま
>いました。
削除したい場合もあるので、希望動作です。
>きりの良いところでエクセルのファイルをアップしてもらい、
>改めて未解決点を質問されると回答もしやすくなると思います。
Sugiさんのデータを試す際のエクセルデータは
http://ohayou-oyasumi.webdeki-bbs.com/
に貼っているデータのまま変更していない状態です(動作させれなくてどこを訂正すればいいのかも分からないため)
マクロのはいっていない新規ブック(ブック名と置換というシート名は同じに合わせました)
も作ってB列コピーを手動でして試してはも見たのですが上手くいきませんでした)
Indexへ
(33191)← 【33196】→(33202) ------------------------ 【タイトル】Re(8):インタープリタの起動
【記事番号】 33196 (33191 )
【 日時 】09/02/24 14:35
【 発言者 】sugi
sugiです。aiさん、こんにちは。
aiさん wrote:
> コピーしてNOTEPADに貼り付け全角を半角に変換をかけてEXCEL置換.
> bat.textとdecode.batという名前で保存し、EXCEL置換.bat.textを
> decode.batにドラックしたのですが、その時点で失敗してしまいま
> す。エラー表示はC¥DISKtop〜のようなアドレスが並んでます。
保存先のフォルダのパスに空白文字が含まれることは想定してませ
んでした。つまり、デスクトップに保存してドラッグアンドドロッ
プを行なうとエラーになります。どこか空白の含まれないパス上に
保存してやり直して下さい。
2/19日の日付けの「複数同時置換.xls」を取り出して確認していた
のですが、最新の2/21日付の訂正データの「複数同時置換.xls」だ
とエラーになることに気がつきました。こちらのエクセルファイル
に対応させました。
http://ohayou-oyasumi.webdeki-bbs.com/ohayou-oyasumi_tree_p_3.html
前回同様、「EXCEL置換.bat.txt」を「decode.bat」にドラッグア
ンドドロップして下さい。できた「EXCEL置換.bat」を「複数同時
置換.xls」と同じフォルダに入れて外部変形を実行して下さい。
外部変形を実行するとエクセルを立ち上げて、データを読み込んで、
「変換」マクロの実行までを行います。これで良ければそのままファ
イルを終了。「表選択」などを修正したければ修正して「変換実行」
後、ファイルを終了して下さい。jw_win に戻って文字が変換でき
ていれば成功です。
=== decode.bat (ここから) ===
ruby -Ks -x %~f0 %1 %2 %3 %4 %5 %6 %7 %8 %9
exit
#! ruby
$stderr=open(File.dirname(ARGV[0])+'\error.log',"w")
ARGV.each{|argv|
unless FileTest.file?(argv.sub(/\.te?xt$/i,""))
open(argv.sub(/\.te?xt$/i,""),"wb"){|e|
e.print open(argv).read.unpack("m")}
end}
=== decode.bat (ここまで) ===
=== EXCEL置換.bat.txt (ここから) ===
QFJFTSBFWENFTJJ1ircNCkBlY2hvIG9mZg0KUkVNICNqd3cNClJFTSAjY2QN
ClJFTSAjemMNClJFTSAjYnoNClJFTSAjaDMNClJFTSAjaGOBeUVYQ0VMknWK
t4F6lc+NWIK3gumUzYjNgvCRSZHwDQpSRU0gI3p6DQpSRU0gI2UNCg0KY29w
eSBqd2NfdGVtcC50eHQgandjX3RlbXAuYmFrDQpydWJ5IC14ICV+ZjANCnJl
bSBwYXVzZQ0KZ290byBFTkQNCg0KIyFydWJ5IC1Lcw0KDQokc3RkZXJyPW9w
ZW4oImVycm9yLmxvZyIsInciKQ0KJHN0ZG91dD1vcGVuKCJqd2NfdGVtcC50
eHQiLCJ3IikNCg0KcmVxdWlyZSAid2luMzJvbGUiDQpyZXF1aXJlICJXaW4z
MkFQSSINCnJlcXVpcmUgIndpbjMyL2NsaXBib2FyZCINCg0KZXhjZWwgPSBX
SU4zMk9MRS5uZXcoJ0V4Y2VsLkFwcGxpY2F0aW9uJykNCmV4Y2VsLnZpc2li
bGU9dHJ1ZQ0KV0lOMzJPTEUuY29uc3RfbG9hZChleGNlbCkNCnhscz1GaWxl
LmV4cGFuZF9wYXRoKCIuL5WhkJSTr46eknWKty54bHMiKQ0KYm9vaz1leGNl
bC53b3JrYm9va3Mub3Blbih4bHMpDQpzaGVldD1ib29rLndvcmtzaGVldHMu
aXRlbSgiknWKtyIpDQoNCm9wZW4oImp3Y190ZW1wLmJhayIpLnJlYWQuDQog
IHNjYW4oL15jW15jaW5dW15cIl0qXCIoLiopLykuDQogIGZsYXR0ZW4uZWFj
aF93aXRoX2luZGV4e3x0LGl8DQogIHNoZWV0LmNlbGxzLml0ZW0oMitpLDEp
LnZhbHVlPXR9DQoNCiMgg32DToONjsCNcw0Kc2hlZXQuc2VsZWN0DQpzaGVl
dC5jZWxscy5pdGVtKDIsNCkudmFsdWU9IpXPireCt4LpIg0KZXhjZWwucnVu
KCKVz4q3IikNCnNoZWV0LmNlbGxzLml0ZW0oMiwyKS5zZWxlY3QNCg0KYmVn
aW4NCiAgb3Blbih4bHMsImEiKQ0KcmVzY3VlIEVycm5vOjpFQUNDRVMNCiAg
c2xlZXAgMC41DQogIHJldHJ5DQplbmQNCg0KY2xpcCxpPVdpbjMyOjpDbGlw
Ym9hcmQuZGF0YSwwDQpjbGlwPWNsaXAgPyBjbGlwLnNwbGl0KCJcclxuIikg
OiAiIg0Kb3BlbigiandjX3RlbXAuYmFrIikuZWFjaHt8dG1wfA0KICBpZiAv
XmhxLz1+dG1wDQogICAgcHV0cyAiaGQiDQogIGVsc2lmIC9eKGNbXmNpbl1b
XlwiXSpcIikoLiopLz1+dG1wICYmIGNsaXBbaV0NCiAgICBwdXRzICQxK2Ns
aXBbaV0NCiAgICBpKz0xDQogIGVsc2UNCiAgICBwcmludCB0bXANCiAgZW5k
fQ0KDQpfX0VORF9fDQo6RU5EDQo=
=== EXCEL置換.bat.txt (ここまで) ===
--
sugi
Indexへ
(33196)← 【33202】→(33206) ------------------------ 【タイトル】Re(9):インタープリタの起動
【記事番号】 33202 (33196 )
【 日時 】09/02/24 17:36
【 発言者 】ai
▼sugiさん:
エクセルを外部エディタに設定する際もそれに引っかかっていたのに
パスに空白があったら駄目という基本事項をすっかり忘れておりました。
前回のデータをCドライブに移動して試してみたところ動作いたしました。
お手間を取らせてしまって誠に申し訳ありません。
エラーログ確認しておりませんでした、申し訳ありません。
C:/jww/JW外部変形/文字/EXCEL置換.bat:24:in `require': No such file to load -- win32/clipboard (LoadError)
from C:/jww/JW外部変形/文字/EXCEL置換.bat:24
確認したところ上記の表示でしたので、もしかして
win32/clipboardのダウンロードが必要なのかと思い検索して
http://d.hatena.ne.jp/jamzz/mobile?date=20071004
あたりの内容なのかと思ったのですが、
J_GARU
http://officehikari.art-studio.cc/
でRubyを一括ダウンロードして自分では設定していないのでRubyに関してはよく分からず
怖くて手が出せておりません(見たところ手順が多く大変そうなので)
会社のPC壊すとまずいので家に帰ってから家のPCで試そうかと思っております。
Indexへ
(33202)← 【33206】→(33207) ------------------------ 【タイトル】Re(10):インタープリタの起動
【記事番号】 33206 (33202 )
【 日時 】09/02/24 20:09
【 発言者 】sugi
sugiです。aiさん、こんにちは。
aiさん wrote:
> C:/jww/JW外部変形/文字/EXCEL置換.bat:24:in `require': No
> such file to load -- win32/clipboard (LoadError) from
> C:/jww/JW外部変形/文字/EXCEL置換.bat:24
>
> 確認したところ上記の表示でしたので、もしかして
> win32/clipboardのダウンロードが必要なのかと思い検索して
> http://d.hatena.ne.jp/jamzz/mobile?date=20071004
> あたりの内容なのかと思ったのですが、
>
> J_GARU
> http://officehikari.art-studio.cc/
> でRubyを一括ダウンロードして自分では設定していないのでRubyに
> 関してはよく分からず怖くて手が出せておりません(見たところ手
> 順が多く大変そうなので)会社のPC壊すとまずいので家に帰ってか
> ら家のPCで試そうかと思っております。
多分、その通りだと思います。J_GARUには「win32-clipboard」の
パッケージが入ってないようですね。
http://lldev.jp/ruby/tips/win32_clipboard.html
を参考にして「win32-clipboard」をインストールしてもらうか、
http://rubyforge.org/frs/?group_id=167
の「One-Click Installer - Windows」から ruby をインストール
し直してもらえば利用できるようになると思います。ちなみにわた
しは後者の「ruby186-25.exe」を利用してます。
「2/24 外部変形とエクセルを使った置換」を確認させてもらいま
した。エクセルを直接起動すると最初にマクロの警告ダイアログが
出るのですが、ruby や VBS から起動するとこれを回避することが
できます。ruby版は既に紹介済みなので今回は VBS版です。
バッチファイルの
start /wait Excel.exe 複数同時置換.xls
を
start /w excel.vbs
に変更して、バッチファイルと同じフォルダ内に次のファイルを入
れてみて下さい。いつものように全角スペースは半角スペースに変
更しておいて下さい。
=== excel.vbs (ここから) ===
Option Explicit
Dim fso, excel,wsh,path,xls,txt,book
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Set excel = WScript.CreateObject("Excel.Application")
Set wsh = WScript.CreateObject("WScript.Shell")
excel.Visible = True
path = wsh.CurrentDirectory
xls = path & "\複数同時置換.xls"
Set book=excel.workbooks.open(xls)
Do
'If wsh.AppActivate("Microsoft Excel - 複数同時置換.xls") Then
If wsh.AppActivate("Microsoft Excel") Then
WScript.Sleep 1000
Else
Exit Do
End If
Loop
Set fso = Nothing
Set excel = Nothing
Set wsh = Nothing
=== excel.vbs (ここまで) ===
エクセルの終了まで待機させるのに ruby版と同じ方法は使えなかっ
たので AppActivate を利用してみました。VBS はあまり知らない
のでおかしなところに気づかれた方は修正して下さい。^^;
--
sugi
Indexへ
(33206)← 【33207】→(33219) ------------------------ 【タイトル】Re(11):インタープリタの起動
【記事番号】 33207 (33206 )
【 日時 】09/02/24 21:12
【 発言者 】ai
▼sugiさん:
ありがとうございます。
仕事が終わりましたら取り掛かりたいと思います。
途中でデジタル署名してマクロのダイアルログが出ないようにしていたのを忘れて
コードのおかげでダイアルログが出ないんだと勘違いしておりました。
http://allabout.co.jp/computer/msexcel/closeup/CU20070325A/
指摘していただいたおかげでいまさら勘違いに気が付きました。
読み返すといっちさんも同じ事を指摘されていました、申し訳ありません。
http://hpcgi2.nifty.com/jw_cad/c-board.cgi?cmd=one;no=33103;id=004
Indexへ
(33207)← 【33219】→(33253) ------------------------ 【タイトル】Re(12):インタープリタの起動
【記事番号】 33219 (33207 )
【 日時 】09/02/25 23:02
【 発言者 】いっち
▼aiさん:
こんばんは。
>途中でデジタル署名してマクロのダイアルログが出ないようにしていた
だったら、無理して直さなくて良いと思います。
>読み返すといっちさんも同じ事を指摘されていました
確かに自分で作っている外部変形は、vbsを経由していますが、
今回のように、エクセルのシート上で加工するタイプの
外部変形はつくっていませんでした。
------------------------------------------------------------------
>2.VBScript逆引き大全500の極意 井川はるき著
の573〜574ページにExcel.Applicationオブジェクトの
UserControlプロパティの説明が、あります。
これを用いても、出来るようですが
aiさんの採用された方法が一番確実だと
思います。
>上記を、読むのは、肝心のエクセルを、もう少し学ばれてからで、
>良いような気もします。
この気持ちに、変わりはありません。
Indexへ
(33219)← 【33253】→(33252) ------------------------ 【タイトル】Re(13):インタープリタの起動
【記事番号】 33253 (33219 )
【 日時 】09/02/27 00:36
【 発言者 】ai
▼いっちさん:
こんばんは。
>2.VBScript逆引き大全500の極意 井川はるき著
>の573〜574ページにExcel.Applicationオブジェクトの
>UserControlプロパティの説明が、あります。
具体的な説明ありがとうございます。
いろいろ一気にやろうとすると頭がパンクして無理が出そうなので
徐々に自分のペースでがんばろうと思います、ありがとうございます。
Indexへ
(33253)← 【33252】→(33129) ------------------------ 【タイトル】Re(11):インタープリタの起動
【記事番号】 33252 (33206 )
【 日時 】09/02/27 00:34
【 発言者 】ai
▼sugiさん:
紹介していただいた上部アドレスのほうは、格納場所などがよく分からず
下記のサイトのほうでダウンロードした後試してみたのですが、動かせませんでした。
いろいろいじってみたのですが、自分には荷が重いようです。
申し訳ありません。
VBSですが、快適に動作ができました、設定の手間がなくなり素敵です。
自分でも調べてみたのですがどこをどうするのか全然理解できていなかったので
勉強になりました。
エクセル2000だと署名ができないようですし助かりそうです。
(試してないので置換マクロが2000で動作するかどうかがわかりませんが)
動作としては毎回マクロONにするのに比べたら全然気にならない程度ですが
jwへの戻しの際に少し画面が止まる時間が長くなるようでした。
導入したデータを掲示板に上げました。
http://ohayou-oyasumi.webdeki-bbs.com/
Indexへ
(33252)← 【33129】→(33128) ------------------------ 【タイトル】Re(5):エクセル置換のマクロ訂正予定です
【記事番号】 33129 (33123 )
【 日時 】09/02/21 23:13
【 発言者 】ai nekobasu83@yahoo.co.jp
▼mirrorさん:
ありがとうございます。
内容が理解できていないのでsugiさんの返信も含めて
見てみようと思います。
Indexへ
(33129)← 【33128】→(33133) ------------------------ 【タイトル】Re(4):エクセル置換のマクロ訂正予定です
【記事番号】 33128 (33122 )
【 日時 】09/02/21 23:08
【 発言者 】ai nekobasu83@yahoo.co.jp
▼sugiさん:
理解するにはかなり時間がかかりそうです、申し訳ありません。
(できるかどうかも怪しいですが)
データきれいに抜き出せました。
エクセル側操作でB列コピーの前に
Application.CutCopyMode = FalseいれてTEMP.TEXTへの書き出しの部分消して
試してるのですが、変換はできませんでした。
前回みたいな勘違いだと思うのでもう少し調べようと思います。
(全角空白を半角空白処理はしました)
動作状況が普段使ってないパソコンなので月曜には会社で試してみます。
def excel_end
require "Win32API"
require "win32/clipboard"
の部分から下のところでクリップボードのデータを
TEXTファイルの文字該当箇所にもどしてくれてるんだとおもってるのですが
間違ってたらすみません。
Indexへ
(33128)← 【33133】→(33134) ------------------------ 【タイトル】Re(5):エクセル置換のマクロ訂正予定です
【記事番号】 33133 (33128 )
【 日時 】09/02/22 00:50
【 発言者 】sugi
sugiです。aiさん、こんにちは。
aiさん wrote:
> データきれいに抜き出せました。
>
> エクセル側操作でB列コピーの前に
> Application.CutCopyMode = FalseいれてTEMP.TEXTへの書き出しの部分消して
> 試してるのですが、変換はできませんでした。
スクリプトで自動化しているのは変更前の文字を取り込むところま
でなので、変更後の文字列を作るには「変換実行」のボタンで変更
をして下さい。
aiさん wrote:
> def excel_end
> require "Win32API"
> require "win32/clipboard"
> の部分から下のところでクリップボードのデータを
> TEXTファイルの文字該当箇所にもどしてくれてるんだとおもってるのですが
> 間違ってたらすみません。
その通りです。:-)
外部変形なので「jwc_temp.txt」というファイルに書き込んでいま
す。
--
sugi
Indexへ
(33133)← 【33134】//(33106) ------------------------ 【タイトル】Re(6):エクセル置換のマクロ訂正予定です
【記事番号】 33134 (33133 )
【 日時 】09/02/22 01:05
【 発言者 】ai
【 リンク 】http://ohayou-oyasumi.webdeki-bbs.com/
▼sugiさん:
>スクリプトで自動化しているのは変更前の文字を取り込むところま
>でなので、変更後の文字列を作るには「変換実行」のボタンで変更
>をして下さい。
エクセルブックを閉じる際にB列データコピーするようにマクロを組んでるので
コピーはできると思います、再度確認してみます。
>その通りです。:-)
よかったです。
話ずれますが、↑英語圏の絵文字でしょうか、かわいいです。
>外部変形なので「jwc_temp.txt」というファイルに書き込んでいま
>す。
そこは何とか理解できてるので大丈夫です、ありがとうございます。
コードの中身は理解できてませんがorz