プロが教えるわが家の防犯対策術!

お世話になります。

エクセルのマクロでワークシートをprn形式で保存するために
下段のマクロを作成しました。

実行すると目的通り「B5」セルの値をファイル名にして、
prn形式で保存するところまでは問題ありません。

ですがアクティブシートのシート名が
「B5」セルの値に変わってしまいます。

アクティブシートの名前はそのままで、
保存するファイル名だけ「B5」セルの値を
割り当てたいと思っております。

すいませんが以下のコードの
間違っているところを教えて下さい。

追記)
単純な処理なので前述の処理を行う
新規のコードを書いて頂いてもOKです。

原因不明で不思議には感じているですが、、。

※出力は「.prn」ですが、拡張子は「.html」です。
※EXCELのバージョンは2010です
※F1ヘルプの呼び出しが壊れてしまいヘルプが閲覧できません

↓ このサイトを参考にしました
http://www.officepro.jp/excelvba/book_new/index9 …


すいませんがよろしくお願いします。

Sub B5LSave_06()
Range("B5").Select
Dim book1 As Workbook
Dim i As String

Set book1 = ActiveWorkbook
i = Range("B5").Value

book1.SaveAs Filename:="C:\A\" & i & ".html", _
FileFormat:=xlTextPrinter

End Sub

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

  • どう思う?

    こういうツール(ソフト)って、Visual Basicでも作れますか?

    こんな感じの簡単なソフトを作成したいので、
    プログラミングの勉強をしようと思っています。
    VBAに慣れているので、Visual Basicを勉強しようと思っています。

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/11/22 10:30

A 回答 (4件)

これって 1つのシートだけを CSV に出力するのと同様の処理でよろしいのでは?



Sub Sample()
Dim book1 As Workbook
Dim i As String

ActiveSheet.Copy
Set book1 = ActiveWorkbook
i = Range("B5").Value

book1.SaveAs Filename:="C:\A\" & i & ".html", _
FileFormat:=xlTextPrinter

book1.Close False
End Sub
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます

>
1つのシートだけを CSV に出力するのと同様の処理でよろしいのでは?

その通りでした!

アクティブのワークシートだけ
出力すればいいんですね。

アクティブシートだけが必要なのですが、
横着していて、全く気が付きませんでした。

今回はご解答ありがとうございます。
機会がありましたらまたお願いします。

お礼日時:2017/11/22 10:03

こんばんは。



>こういうツール(ソフト)って、Visual Basicでも作れますか?
VB.Net ということでしょうか。もちろんですね。

資料の絶対数が違います。今、VBAは、暗中模索でやっているだけですから。ただし、VB.Net はあまりポピュラーではなさそうで、MS では、C#おすすめのようです。世間(雜誌)では、Python が頻繁に宣伝していますね。

一応、私は、VB.Net の公開講座で何十時間と学校に行って、覚えたつもりでいたけれども、それから、あっという間に、10年が経ってしまいました。私のやっているのは、VBAでこれだけできる、ということをやっているに過ぎません。無駄に、10年を過ごしてしまった感が強いです。

VBAの最大の弱点は、意外と知られていないのは、VBA自体のメモリの使用量の制限なのです。VB.Net というよりも、VSは豊富なツールが多いわけです。本音の所は、本格的には「せざるを得ない」というところなのです。いえ、現行でも、Excel等のVBAは、そのまま、フリーでVSに移行できる(よう)です。私のほうは、VSTOをインストールしたままになっていますが。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

参考になりました、
プログラミングついては、
機会をみつけてあらためて
たずねます。

いろいろ教えて頂きありがとうございました。

PS
今回はNo.3さんにベストアンサーを譲りますね。
機会がありましたら、またいろいろ教えて下さい。
いつもご解答ありがとうございます。

お礼日時:2017/11/23 02:23

こんにちは。



>webやブログに貼り付ける文字リンクや表を
>エクセル上で作成して出力しています。

>テキストで開いて貼り付けています。

そういうことでしたか!
それは、あまりにも違いすぎるような気がします。
私は、勢いで貼り付けることが怖いために、全部をマクロ化することはしませんが、可能なことは可能です。

簡単な例を示してみましょうか?
単なる可能性だけを示唆するもので、本格的なものではありません。
今の私の力は、このぐらいだということをお見せしているだけです。
(かなり劣化しています)

以下は、失敗する可能性は、補正処理していないので、10の内1回程度です。昔の、闇雲の時代から、やっと、エラー処理にたいする措置ができるようになったという気がしています。仕事でお使いでしょうから、不謹慎かもしれませんが、こういうのは、面白いですよね。遊び感覚になってしまっています。

p.s.どんなに難しい質問でも、気に入った質問は、解答が出るまで、私は考え続ける人です。ですが、本格的知識がないのと、最近、この手のものは、Python に移行しつつあるので、余計に不勉強が祟っています。これじゃあいけないという事ばりです。

'//教えて!gooの検索プログラム//
'//
Sub OshieteGoo_Search()
Dim sTxt As Variant
Dim myURL As String
Dim objIE As Object
Dim i As Long
On Error GoTo ErrHandler
sTxt = Application.InputBox("検索語を入れてください", "検索ワード", "EXCEL", Type:=2)
If VarType(sTxt) = vbBoolean Or sTxt = "" Then Exit Sub
myURL = "http://oshiete.goo.ne.jp/search_goo/result/?MT=" & sTxt & "&code=utf8&mt_opt=a&qatype=qa&st=all&sr=date&tf=m1"
Set objIE = CreateObject("InternetExplorer.Application")
  objIE.Visible = True
  objIE.Navigate2 myURL
With objIE
  Do Until Not .Busy And .readyState = 4: DoEvents: Loop
  Set objIE = objIE
End With
'On Error Resume Next
'VBAコーディングルール反則
Dim BBtns
Dim btn
With objIE
  Do Until Not .Busy And .readyState = 4: DoEvents: Loop
  Set BBtns = .document.getElementsByTagName("a")  '(38)
    For i = 36 To 40
    If BBtns(i).InnerText Like "回答受付中" Then
     Set btn = BBtns(i)
       If Not btn Is Nothing Then
        btn.Click
       Exit For
       End If
     End If
    Next
End With
ErrHandler:
If Err.Number > 0 Then MsgBox Err.Description & " " ' & Erl
End Sub
この回答への補足あり
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

いろいろ考えて頂きありがとうございます。
今回はNo3さんの解答で解決しましたが
機会があれば、またお願いします。

ワークシートだけ出力すればいいんですね。
気が付きませんでした。

お礼日時:2017/11/22 10:24

あまり、自信がありません。


こういうものには、新しいスタイルになってからは、手をつけたことがなかったのですが、ソースを見比べると、昔と今では雲泥の違いがあるようですね。

この質問上にあるマクロでは、ただTextファイルの拡張子が、htmlになっているだけのものでしたから、以下は、意味的に違うのかもしれません。

Webファイルの発行を試しに作ってみました。出力は、UTF-8にしました。

>アクティブシートの名前はそのままで、
>保存するファイル名だけ「B5」セルの値を
>保存の時にシート名が変わってしまう
といっても、この出力では、シート構造を維持しているわけでもありません。
シート構造を維持する方法は、別にあるはずです。(確かめてはいません)

'//
Sub HtmlPublish()
 Dim myPath As String
 Dim fName As String
 Dim shName As String
 myPath ="C:\A\"
 fName = Range("B5").Value
 shName = ActiveSheet.Name
 With ActiveWorkbook
  .WebOptions.Encoding = msoEncodingUTF8
  With .PublishObjects.Add( _
    xlSourceSheet, _
    myPath & fName & ".html", _
    shName, "", _
    xlHtmlStatic, _
    ThisWorkbook.Name)
   .Publish (True)
   .AutoRepublish = False
  End With
 End With
End Sub
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます

この質問上にあるマクロでは、ただTextファイルの拡張子が、htmlになっているだけのものでしたから、以下は、意味的に違うのかもしれません。

おっしゃる通りです。

webやブログに貼り付ける文字リンクや表を
エクセル上で作成して出力しています。

例えば、D10(文字)、E10(URL)を入力して
「&」を使って連結するようにして
文字リンクを作成しています。

その後、以下のマクロで出力したものを
テキストで開いて貼り付けています。
※たくさんあるし、表もあるのでD10、E10だけではありませんが。

なので、拡張子をhtmlにしているのは、
動作確認する時に見やすいからだけで、
実際はテキストファイルで開いたものをコピーして、
Web上のhtmlのエリアに貼り付けています。

なので、このやり方ですと、
テキストで開いた時にフォントのサイズやセルの幅、etc.が残るので、
全選択(Ctlr+A)が利用できない、etc.があり、
求めていたものとニュアンスが違います。

質問に書いた
『※出力は「.prn」ですが、拡張子は「.html」です。』
というのはそういう意味です。


ですが、こんな複雑な方法になるとは、
想像してなかったので、名前の付け方を
以下のようにして、B5に連番だけ入れることにしました。

これだけでだいぶマシですから。

book1.SaveAs Filename:="C:\A" & "ファイル名-" & i & ".html", _


いつもご解答ありがとうございます。
理屈がわかっただけでも満足です。今回はご解答ありがとうございました。


追記
しばらく質問は開けておきますので、もし何かありましたら
教えて頂ければありがたいです。


※といっても、この出力では、シート構造を維持しているわけでもありません。

シート構造は維持する必要がありません。
元のワークブックはツールとして使うだけで保存しません。
出力するテキストファイルだけが必要ですから。

出力するファイル形式はprnでないとだめです。
csvのようにコンマが入ると使えませんし、
今回のようにセルの幅やフォントサイズ、etc.が残ると
意味がありませんので。

お礼日時:2017/11/21 12:15

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

このQ&Aを見た人はこんなQ&Aも見ています