エクセルからメール送信

このQ&Aのポイント
  • エクセル2000とOutlook2000を使用してメールを送信する方法について質問があります。
  • VBAや手動で生成されたメールをメッセージファイルとして保存することはできるのでしょうか?
  • MAPI対応のメーラーが必要なことに注意してください。
回答を見る
  • ベストアンサー

エクセルからメール送信

エクセル2000 Outlook2000です。 エクセルでメールを送信する段階までは以下のコードできるのですが、このマクロで生成されたメールを、送信前にメッセージファイル(*msg)として保存することは出来ないものでしょうか? VBAでも手動でもかまいません。 Sub test01() If Application.MailSystem <> xlMAPI Then MsgBox "この機能を使用するためには MAPI対応のメーラーが必要です。", vbCritical Else ActiveSheet.Copy After:=Sheets(Sheets.Count) Set ns = ActiveSheet With ns .DrawingObjects.Delete .Cells.Validation.Delete End With SendKeys "%FDM", True End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 >ただ、エクセルでメニューの「ファイル」→「送信」→「メールのあて先」で作成したメールは、送信する前は送信フォルダにも下書きフォルダにも入らないようなので それは、そういう設定が、Outlook 側でされていますね。送信フォルダにいれずに、送信したら、保存フォルダ(?)に入るようになっているのだと思います。 以下は、Excel用ですが、コード的には簡単です。 私は、送信フォルダに入れるようにしてあるので、その設定だけは、今のところ、いじりたくないのですが、そうすると、使い方が、こちらではややこしいですね。オートメーション・オブジェクトに入っているので、Outlook側のイベントは動いてはいないのですが、Outlook側を起動すると、以下のマクロが起動します。こちらがイメージしていたものとはだいぶ違いました。(Outlook 2003 で試験中)   myPath = Application.DefaultFilePath & "\" このApplication は、Excelですから、Excel側のフォルダに保存されます。 どちらかというと、設定を変えたほうが早い気がしますが。 '----------------------------- '標準モジュール Public MyClass As New Class1 Sub Auto_Open()   Set myOlApp = CreateObject("Outlook.Application") 'New Outlook.Applicatn   Set MyClass.myOlApp = myOlApp End Sub '----------------------------- 'Class モジュール(Class1) Public WithEvents myOlApp As Outlook.Application Private Sub myOlApp_ItemSend(ByVal Item As Object, Cancel As Boolean) Dim prompt As String Dim myPath As String   myPath = Application.DefaultFilePath & "\"   prompt = Item.Subject & "を保存しますか?"   If MsgBox(prompt, vbYesNo + vbQuestion, "メール保存") = vbNo Then     Item.SaveAs myPath & strName & ".msg", 3     'Cancel = True 'これを外すと送信されない(ハズですが)   End If End Sub

merlionXX
質問者

お礼

ありがとうございました。 せっかくご指導いただきましたが、もうわたしの理解を超えてしまいました。 みのほど知らずの質問をしてしまったと後悔しております。 出直します。 教えていただいたのにすみませんでした。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんにちは。 >何度みても個人用フォルダ"に、送信トレイや受信トレイはありません。 それは、私の書いた文章が不十分だったと思います。 「"個人用フォルダ"」の名称の代わりに、ご自身の「ID]が入っている」わけですね。 >わたしのIDで立ち上げると「受信トレイ」や「送信済みアイテム」、「下書き」の各フォルダの中にあるメールを見ることが出来ます。 というなら、その「ID」のフォルダの中に、[送信トレイ]もあるはずです。 例: Set MyFolder = MyNMSpace.Folders("個人ID").Folders("送信トレイ") しかし、「送信トレイ」に入れる習慣がないのなら、#4で示したOutlookのオプションの設定を変えて「送信トレイ」に入れて、その後をマクロで、[送信実行]というコードを書かないといけないことになります。しかし、それだったら、送信トレイではなく、送信済みトレイから取り出しても同じですよね。話を分かっていただけるかしらね……。

merlionXX
質問者

お礼

大変お手数をおかけしました。 Set MyFolder = MyNMSpace.Folders("個人ID").Folders("送信トレイ") を Set MyFolder = MyNMSpace.Folders("Mailbox - Xxxx, Yyyy(名前です)").Folders("送信トレイ") にかえたところ Sub Test02() では「送信トレイにメールはありません」となりました。 Sub Test03()ではエラーになりませんが.msgファイルは作成されませんでした。(送信トレイにメールがないのだから当然ですが) ためしにFolders("送信トレイ")をFolders("削除済みアイテム")に変えて実行したらMyDocumentフォルダに.msgファイルがいっぱいできました。 ただ、エクセルでメニューの「ファイル」→「送信」→「メールのあて先」で作成したメールは、送信する前は送信フォルダにも下書きフォルダにも入らないようなので送信前に(送信しなくとも)メッセージファイルとして保存することは出来ずにいます。これはどうしようもないのでしょうか?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 >SendKeys "%FDM", True でも、これで作成したメールは送信する前は下書きフォルダには入らないようです。 Outlook 側からでなければ、下書きフォルダには、いずれにしても入らないと思います。 Outlook のツールのオプションの設定で、 メール配信-メールアカウント・オプション    [レ]接続後直ちにメッセージを送信する とかしてあったら、たぶん、[送信トレイ]にも入っていないので、送信後の保存用フォルダを探すしかありません。 >Outlook Today -[Mailbox-○○○(名前)]からぶら下がっているように見えます。 Outlook Today は関係ありません。親フォルダですから、ここが、MyNMSpace.Folders のことです。その下にあるはずですから、そこをローカルウィンドウ等で探して指定すればよいはずです。 Test03 のプロシージャ Set TestFolders = MyNMSpace.Folders '※臨時コード Stop '※臨時コード Set MyFolder = MyNMSpace.Folders("個人用フォルダ").Folders("送信トレイ") ' ※そのTestFoldersの内容が、どうなっているかだと思いますね。 'たぶん、"個人用フォルダ" に、[名前]が入っているのでは? 'そのオブジェクトの下に、Folders があり、その中に、[送信トレイ]自体はあるはずです。

merlionXX
質問者

お礼

何度もすみません。 今日、会社で以下のコードをためしました。 Set TestFolders = MyNMSpace.Folders '※臨時コード Stop '※臨時コード Set MyFolder = MyNMSpace.Folders("個人用フォルダ").Folders("送信トレイ") Stop '※臨時コード で止まり、黄色くなります。 そのときローカルウィンドウでは MyFolderの値はNothing TestFoldersの値は何も表示されていませんでした。 > たぶん、"個人用フォルダ" に、[名前]が入っているのでは? >'そのオブジェクトの下に、Folders があり、その中に、[送信トレイ]自体はあるはずです。 何度みても個人用フォルダ"に、送信トレイや受信トレイはありません。 会社のイントラにつながっており、他のパソコンでもわたしのIDで立ち上げると「受信トレイ」や「送信済みアイテム」、「下書き」の各フォルダの中にあるメールを見ることが出来ます。(個人用フォルダは見られません)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 >Set MyFolder = MyNMSpace.Folders("個人用フォルダ").Folders("送信トレイ") この名前は、規定の名前です。私は、Microsoft 系のメーラーは基本的には使っておりませんので、細かい部分は良く分かりません。そのままの状態になっています。こちらでは、送信前に、"個人用フォルダ"の "送信トレイ" に納まっているので、そうしているだけですから、そちらのOutlookの実態に合わせて名称を変えてください。ただし、実際のメールが一時保管される場所です。 もちろん、ローカルウィンドウで調べていただいてもよいと思います。 >メッセージファイル(*msg)は、 Outlookの「名前を付けて保存」で、「メッセージファイル」を選択して保存すると作成される、1通のメール形式のファイルです。拡張子が.msgです。 そういう意味でしたか。 >送信前にメッセージファイル(*msg)として保存することは出来ないものでしょうか? それは、以下のようにすれば可能だと思います。 '------------------------------------------ Sub Test03()   Dim msg As String   Dim MyOl As Object 'Outlook.Application   Dim MyNMSpace As Object 'Namespace   Dim MyMail As Object 'MailItem   Dim MyFolder As Object 'MAPIFolder   Dim myPath As String   Dim strName As String   Dim i As Long   Dim j As Variant     Set MyOl = CreateObject("Outlook.Application") 'New Outlook.Application   Set MyNMSpace = MyOl.GetNamespace("MAPI")   Set MyMail = MyOl.CreateItem(0)   'パスの設定は、適宜に決めてください。   myPath = Application.DefaultFilePath & "\"   Set MyFolder = MyNMSpace.Folders("個人用フォルダ").Folders("送信トレイ")     For i = 1 To MyFolder.Items.Count     With MyFolder.Items(i)      strName = Format$(Date, "yymmdd")      Do: j = j + 1: Loop While Dir(myPath & strName & j & ".msg") <> ""      .SaveAs myPath & strName & j & ".msg", 3 ''olMSG=3, olTXT =0     End With   Next i   Set MyFolder = Nothing   Set MyMail = Nothing   Set MyNMSpace = Nothing   Set MyOl = Nothing End Sub

merlionXX
質問者

お礼

大変有難うございます。 ここまで丁寧にお教えいただいたのに、わたしは自分の送信トレイがどこにあるかを取得できないでいます。 Outlookの画面でみると、個人用フォルダよりももっと上の Outlook Today -[Mailbox-○○○(名前)]からぶら下がっているように見えます。 Outlookで作成したメールは送信前は「下書き」というフォルダに入ります。これもOutlook Today -[Mailbox-○○○(名前)]からぶら下がっているように見えます。 ただ、エクセルで手動でファイル→送信→メールのあて先 でも SendKeys "%FDM", True でも、これで作成したメールは送信する前は下書きフォルダには入らないようです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんにちは。 >おそわったコードをそのまま使っているのです。 一応、前のログは読みました。ざっと読んだので、それについては、いきさつが見えてこないのです。 KenKen_SPさんの最初に書いた、SendMailのコードで良いと思いましたが。 >「UWSC」ってフリーウェアでしょうか? 二種類あります。シェアウェアとフリーソフトウェアとです。 本が出ています。一例で、他にもあります。 http://seshop.com/detail.asp?pid=6462 Windows マクロテクニック 「UWSC」は、一応、その業界では認められたツールです。 >会社の端末なので指定外のソフトは導入できないのです。 たぶん、会社の基準としては、常識的に、CA局証明付きだと思いますが、それは、そちらのご事情ですから、分かりませんし、「UWSC」は、フリー版しかみておりませんので、シェアウェアの扱いを、製作者側が、どの管理にしているか知りませんが、期待は出来ません。これは、あくまでも、こちらの一案です。 「UWSC」をあえて使わなくてはならないということではなくて、そうでないと、それ以外の方法は思いつかないということです。簡単な方法があるのに、それをあえて避けて作るだけの、こちらの余裕がありません。 なお、お分かりになっておっしゃっているとは思いますが、参照設定がそのままになっていましたから、 >Set MyOl = New Outlook.Application 'CreateObject("Outlook.Application") ここは、 Set MyOl =CreateObject("Outlook.Application") です。 >質問にも書きましたが、送信前にメッセージファイル(*msg)として保存したいのです msg という意味が、どのようなファイル形態なのか分かりませんが、コードは、送信前です。 文字列変数 msg は、あるので、それをどのように処理するかは、ご自由です。それを、MsgBox msg で出してもよいです。保存するなら、拡張子のない、[日付]msg でも、それは選択の自由ですが、開けるときに、拡張子がなければ、Windows が聞いてくるかと、とは思います。(今は、ファイル保存は、上書きモードです) >まだ送信されては困るのです。 >そのような方法はないものでしょうか? それは、OutLook の設定の問題ですから、ワンクリックで送信してしまう、ということになれば、そういう方法で、ActiveX のハッキングは無理です。 なお、私のマクロは、[送信]をクリックしても、OutLook で、そのまま送信しないような設定になっていることが条件です。 いずれにしても、今のスタイルでは、結果的に、セキュリティのダイアログが出てくるので、最初から、SendMail を使っても同じことだと思います。 こちらが、宛先もタイトルと日付も取得することを、考慮して気を回しただけですから、データだけでよいなら、シートをTextFile で出力するだけでもよいと思います。それを、もう一度、吸い上げて、MsgBox に出してもよいと思います。

merlionXX
質問者

お礼

何度もありがとうございます。 Set MyOl =CreateObject("Outlook.Application") としたところ作動しましたが、 Set MyFolder = MyNMSpace.Folders("個人用フォルダ").Folders("送信トレイ") が「操作は失敗しました。オブジェクトが見つかりませんでした」というエラーになってしまいました。 エクセルVBAがおぼつかないのにメールまで手をだすのが早すぎたようです。 メッセージファイル(*msg)は、 Outlookの「名前を付けて保存」で、「メッセージファイル」を選択して保存すると作成される、1通のメール形式のファイルです。拡張子が.msgです。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 その質問のコードには、それなりに、前からのいきさつがあるだろうから、そこについては触れませんが、ふつうなら、Sendkeys で、そのような操作をせずに、最初から、Sendmail を使っているだろうし、ある程度の経験があれば、Basp21 を選ぶだろうと思います。 OutLook なら、OutLook 側から、イベントで捕らえる方法もあるうのですが、あくまでも、Excel側からのアプローチにしてあります。わざわざ、MAPIのチェックまでしておいて、途中から、Sendkeys に変えたわけですから、そのようなスタイルだと、最初から最後まで、「UWSC」 でアプリを操作をしたほうが楽かもしれない、と思います。 http://www.uwsc.info/ このコードは、APIを使うレベルのものをより簡単に書けます。 常識的なマクロを書ける人なら、誰でもわかるものだと思います。 なお、以下のコードでは、今回、OutLook 2000 では試しておりません。 それに、MAPI のOutLook では、セキュリティが働いてしまうので、途中でダイアログが出てしまい、確認のためのマウス・クリックが必要になって、UWSC のように、別アプリからの擬似キーストロークによるクリック操作が必要になってしまいます。最初から、無理は承知で書いています。 以下では、OutLookの"送信トレイ"を探しています。 参考までにしてください。 これは、「送信する段階」というか、Excel上で送信した後に、OutLook の送信フォルダ内を調べるものです。 フォルダを変えれば、送信済みも調べられますが、その場合は、For i = 1 to ~ ではなく、MailItems(1) だけでよいと思います。 '--------------------------------- Sub Test02()   Dim msg As String   Dim MyOl As Object 'Outlook.Application   Dim MyNMSpace As Object 'Namespace   Dim MyMail As Object 'MailItem   Dim MyFolder As Object 'MAPIFolder   Dim objText As Object   Dim i As Integer   Dim y As Variant, m As Variant, d As Variant      Set MyOl = New Outlook.Application 'CreateObject("Outlook.Application")   Set MyNMSpace = MyOl.GetNamespace("MAPI")   Set MyMail = MyOl.CreateItem(0)      Set MyFolder = MyNMSpace.Folders("個人用フォルダ").Folders("送信トレイ")      For i = 1 To MyFolder.Items.Count     With MyFolder.Items(i)       msg = .To       msg = msg & vbNewLine & .Subject       y = Year(.CreationTime)       m = Month(.CreationTime)       d = Day(.CreationTime)       msg = msg & vbNewLine & y & "/" & m & "/" & d       msg = msg & String(2, vbNewLine) & .Body 'メール・アイテムは一つということにしている     End With   Next i   Set MyFolder = Nothing   Set MyMail = Nothing   Set MyNMSpace = Nothing   Set MyOl = Nothing   If Trim(msg) = "" Then     MsgBox "送信トレイにメールはありません。", 48     Exit Sub   End If   With CreateObject("Scripting.FileSystemObject")     Set objText = .CreateTextFile(Application.DefaultFilePath & "\msg.txt")     objText.Write msg     objText.Close   End With   MsgBox "msg.txtファイルを出力しました。" End Sub

merlionXX
質問者

お礼

Wendy02さま、いつもありがとうございます。 > ふつうなら、Sendkeys で、そのような操作をせずに、最初から、Sendmail を使っているだろうし おそわったコードをそのまま使っているのです。 「UWSC」ってフリーウェアでしょうか? 会社の端末なので指定外のソフトは導入できないのです。 ご教示のコードを、会社のWindos2000、Excel2000で試しましたが、 Set MyOl = New Outlook.Application の部分で「コンパイルエラー ユーザー定義型はていぎされていません」となってしまいます。 > これは、「送信する段階」というか、Excel上で送信した後に、OutLook の送信フォルダ内を調べるものです。 質問にも書きましたが、送信前にメッセージファイル(*msg)として保存したいのです。 まだ送信されては困るのです。 そのような方法はないものでしょうか?

関連するQ&A

  • エクセルVBAでShapesまたはDrawingObjects

    シート上のフォームなどを表示/非表示するためtest04を書きましたが、「実行時エラー438 オブジェクトはこのプロパティまたはメッソッドをサポートしていません」となります。 しかし、Test05のように同じことをForNextで回せばうまくいきます。 また、Test06のようにShapesをDrawingObjectsに書き換えただけでもうまくいきます。 では、Test04がエラーになるのはなぜでしょうか? Sub test04() With ActiveSheet.Shapes If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub Sub test05() For Each sp In ActiveSheet.Shapes If sp.Visible = False Then sp.Visible = True Else sp.Visible = False End If Next End Sub Sub test06() With ActiveSheet.DrawingObjects If .Visible = False Then .Visible = True Else .Visible = False End If End With End Sub

  • エクセルでchangeプロジェクトを複数設定する場

    すみません、マクロの基本的な部分を分かっておらず、Google検索などで知識を得た程度のど素人なのですが。 A1にあ・い A2にう・え A3にお・か をプルダウンで選べるように設定していて 【い】を選んだ場合は選択肢を【う】と【お】のみにする 【あ】を選んだら選択肢を戻す 【え】を選んだ場合は選択肢を【あ】と【お】のみにする 【う】を選んだら選択肢を戻す 【か】を選んだ場合は選択肢を【あ】と【う】のみにする 【う】を選んだら選択肢を戻す という挙動を設定したく、複数のchangeプロジェクトを書いてみたのですが、どうしても1箇所のみうまくいきません。(下のマクロでは【え】を選んだ場合、A3の選択肢が消えない。) 書き方・考え方自体が間違っているのかもしれませんが、教えていただけませんでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) 処理1 Target 処理2 Target 処理3 Target End Sub Private Sub 処理1(ByVal Target As Range) If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub Else If Range("A1").Value = "い" Then With Range("A2").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="う" End With Range("A2") = "う" With Range("A3").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="お" End With Range("A3") = "お" MsgBox "入場区分を【い】に設定した場合は、分配フラグは【え】、お客様情報取得フラグは【お】に固定となります。" ElseIf Range("A1").Value = "あ" Then With Range("A3").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="お,か" End With With Range("A2").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="=INDIRECT(A1)" End With End If End If End Sub Private Sub 処理2(ByVal Target As Range) If Intersect(Target, Range("A2")) Is Nothing Then Exit Sub Else If Range("A2").Value = "え" Then With Range("A3").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="お" End With Range("A3") = "お" With Range("A1").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="あ" End With Range("A1") = "あ" MsgBox "分配フラグを【え】に設定した場合は、入場認証区分は【あ】、お客様情報取得フラグは【お】に固定となります。" ElseIf Range("A2").Value = "う" Then With Range("A3").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="お,か" End With With Range("A1").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="=INDIRECT(A3)" End With End If End If End Sub Private Sub 処理3(ByVal Target As Range) Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("A3")) Is Nothing Then Exit Sub Else If Range("A3").Value = "か" Then With Range("A1").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="あ" End With Range("A1") = "あ" With Range("A2").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="う" End With Range("A2") = "う" MsgBox "お客さま情報をかに設定した場合は、入場区分は【あ】、分配フラグは【う】に固定となります。" ElseIf Range("A3").Value = "お" Then With Range("A1").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="あ,い" End With With Range("A2").Validation .Delete .Add _ Type:=xlValidateList, _ Formula1:="=INDIRECT(A1)" End With End If End If End Sub

  • Excel VBAを使って給紙方法を変更する(キーストローク使用)

    ExcelのVBAを使って印刷するものによって給紙方法を変えたいと思っています。 調べてみたところ'SendKeysステートメントを使うと設定できそうだったので、下記のような命令文を作ってみたのですがうまく動きません。 どなたか詳しい方いらっしゃいましたら教えていただけないでしょうか? OS:WindowsXP 使用ソフト:Microsoft Excel2003 使用プリンタ:NEC PR-2860N 【コマンドボタン】 本書印刷 → 印刷範囲:「一枚目」(あらかじめ設定してある名前)  給紙方法:自動  控え印刷 → 印刷範囲:「二枚目」        給紙方法:ホッパー2 Private Sub 控え印刷_Click() With ActiveSheet.PageSetup .PrintArea = "二枚目" End With MyPrinterSet ActiveSheet.PrintOut End Sub ―――――――――――――――――――――――――――――― Private Sub 本書印刷_Click() With ActiveSheet.PageSetup .PrintArea = "一枚目" End With MyPrinterSet2 ActiveSheet.PrintOut End Sub ――――――――――――――――――――――――――――――― Private Sub MyPrinterSet() 'SendKeysステートメントでプリンタ設定 '自動給紙から手差しへ変更 ActiveSheet.Select SendKeys "%FU"    'Excel画面でファイル(F)、ページ設定... SendKeys "%O"    ‘オプション SendKeys "{TAB 8}"  ‘一番端の[メイン]のタブに合わせる SendKeys "{RIGHT}" ‘一つ右の[用紙]タブへ移動 SendKeys "%S"    ‘給紙方法選択 SendKeys "{DOWN 2}" 'ホッパー2に設定 SendKeys "{ENTER}"  SendKeys "{TAB 5}" ‘[用紙]タブを選択 SendKeys "{LEFT}" ‘一つ左の[メイン]タブへ移動 SendKeys "{ENTER 2}"  ―――――――――――――――――――――――――――――― End Sub Private Sub MyPrinterSet2() 'SendKeysステートメントでプリンタ設定 '例、EPSON LP-****を手差しから自動へ変更 ActiveSheet.Select SendKeys "%FU" 'Excel画面でファイル(F)、ページ設定... SendKeys "%O" SendKeys "{TAB 4}" ‘初期値へ戻すを選ぶ SendKeys "{ENTER 4}"  End Sub ――――――――――――――――――――――――――――――

  • エクセルで図形の削除

    シート内に作図されている線で、 100 < .Height < 200 And 100 < .Width < 200 上記の条件を満たすものを削除したいのですが、以下のマクロですと、全ての線が削除されてしまいます。 シート内に様々な長さ・向きの線を作図して試したのですが。 For Each x In ActiveSheet.DrawingObjects  With x    If 100 < .Height < 200 And 100 < .Width < 200 Then    .Delete    End If  End With Next どこがおかしいでしょうか? ご指摘お願いします。

  • エクセル2000でのVBAについて

    下記のVBAを書いているのですが、3つのIF文を1つに まとめたいのですが教えてください。 If Range("E16") = "申請者" Then Sheets("ログイン").Select Sheets("報告票").Select ActiveSheet.Unprotect Range("M3:U7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("E16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("D3:L7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select If Range("F16") = "所属長承認" Then Sheets("報告票").Select ActiveSheet.Unprotect Range("BS3:CA7").Select Selection.Locked = False Selection.FormulaHidden = False ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True '数式バー表示 Application.DisplayFormulaBar = True Range("H9").Select Else: Sheets("ログイン").Select end if end if end if

  • ■助けてください。■エクセルのマクロで困っています。

    エクセルで、シートを一つ削除するマクロを教えてください。 本当に困っています。 マクロをご存知の方、ずぶの素人の私にご教示何卒よろしくお願いします。 文末にマクロを記述いたしますが、そちらは、 指定した日付以降にエクセルのファイルを開くと シートがすべて削除されて、「有効期限切れ」という シートだけが出てくるというものです。 現在、これを応用して、すべてのシートを 削除するのではなく、ひとつのシートだけ削除したいのです。 例えば「SheetA」、「SheetB」、「SheetC」、「有効期限切れ」という 4つのシートがあったとして、 指定した期日が来たら、「SheetC」だけを削除したいのです。 なお、エクセルファイルを開く際に、マクロを無効にされてしまうと 期日が来てもSheetCが削除されずに 残ってしまっては困るのです。 そこで、マクロを有効にしないと SheetCが現れないようにしたいのです。 (以下のマクロではそのようになっています) 一つだけシートを削除するマクロをやり方をご存知の方、マクロのご教示のほど 何卒よろしくお願い致します。 なお、小生、マクロはずぶの素人でして、 マクロの文面を頂いてコピー貼り付けするぐらいしか 能がありません。 つきましては、以下の文面を モディファイしてご教示頂けませんでしょうか。 よろしくお願いいたします。 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) endsheetname = "有効期限切れ" If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Sheets("SheetA ").Visible Then Sheets("SheetC ").Visible = xlVeryHidden End Sub Private Sub Workbook_Open() endsheetname = "有効期限切れ" If Date >= "3008/09/29" Then Application.DisplayAlerts = False If Sheets.Count = 1 Then If Sheets(1).Name <> endsheetname Then Sheets.Add(After:=ActiveSheet).Name = endsheetname End If Else On Error Resume Next Sheets(endsheetname).Delete On Error GoTo 0 Sheets.Add(After:=ActiveSheet).Name = endsheetname End If sheetnumber = Sheets.Count For i = 1 To sheetnumber For j = 1 To 2 If Sheets.Count = 1 Then Exit For If Sheets(j).Name = " SheetC " Then If Not Sheets("SheetC ").Visible Then Sheets("SheetC ").Visible = True If Sheets(j).Name <> endsheetname Then Sheets(Sheets(j).Name).Delete: Exit For Next Next Range("b" & 3).Value = "ご利用ありがとうございました。" ActiveWorkbook.Save Application.DisplayAlerts = True End If If (Sheets.Count = 1) And (Sheets(1).Name = endsheetname) Then Exit Sub If Not Sheets(" SheetC ").Visible Then Sheets(" SheetC ").Visible = True End Sub

  • エクセルをVBAでOUTLOOKで送信したい(再)

    数年前にエクセルをPDFにして添付ファイルとしてOUTLOOKで送信するコードを教えてもらって毎日のように便利に使っているのですが、今回は元のマクロ付きエクセルのまま同じことがしたく、試行錯誤でpdfをxlmsに変えてみたら、メールは起動して来るのですが 「ファイルが見つかりません」とエクセルが添付されません。 どなたかどこを修正すれば良いのかHELPお願いします。 Option Explicit Sub Saveaspdfandsend() Dim xSht As Worksheet 'Dim xFileDlg As FileDialog Dim xFolder As String 'Dim xYesorNo As Integer Dim xOutlookObj As Object Dim xEmailObj As Object Dim xUsedRng As Range Const PdfDir = "\\XXXX\TEST報告書成績表" 'PDFを保存するフォルダー Set xSht = ActiveSheet 'Set xFileDlg = Application.FileDialog(msoFileDialogFolderPicker) ' 'If xFileDlg.Show = True Then '  xFolder = xFileDlg.SelectedItems(1) 'Else '  MsgBox "You must specify a folder to save the PDF into." & vbCrLf & vbCrLf & "Press OK to exit this macro.", vbCritical, "Must Specify Destination Folder" '  Exit Sub 'End If xFolder = PdfDir & "\" & xSht.Cells(22, 5).Value & " " & xSht.Cells(1, 1).Value & ".pdf" 'Check if file already exist 'If Len(Dir(xFolder)) > 0 Then '  xYesorNo = MsgBox(xFolder & " already exists." & vbCrLf & vbCrLf & "Do you want to overwrite it?", _ '           vbYesNo + vbQuestion, "File Exists") '  On Error Resume Next '  If xYesorNo = vbYes Then '    Kill xFolder '  Else '    MsgBox "if you don't overwrite the existing PDF, I can't continue." _ '          & vbCrLf & vbCrLf & "Press OK to exit this macro.", vbCritical, "Exiting Macro" '    Exit Sub '  End If '  If Err.Number <> 0 Then '    MsgBox "Unable to delete existing file. Please make sure the file is not open or write protected." _ '          & vbCrLf & vbCrLf & "Press OK to exit this macro.", vbCritical, "Unable to Delete File" '    Exit Sub '  End If 'End If Set xUsedRng = xSht.UsedRange If Application.WorksheetFunction.CountA(xUsedRng.Cells) <> 0 Then 'Save as PDF file xSht.ExportAsFixedFormat Type:=xlTypePDF, Filename:=xFolder, Quality:=xlQualityStandard 'Create Outlook email Set xOutlookObj = CreateObject("Outlook.Application") Set xEmailObj = xOutlookObj.CreateItem(0) With xEmailObj .Display .To = "-----.co.jp" .CC = "----.co.jp" .Subject = "XXX報告書" & " " & Range("D10") .Body = "お疲れ様です。" & vbLf & "表題の件、添付の通りです。 " & vbLf & " " & vbLf & "営業部" .Attachments.Add xFolder 'If DisplayEmail = False Then '.Send 'End If End With Else MsgBox "The active worksheet cannot be blank" Exit Sub End If End Sub

  • ブック上にあるグラフの外枠を全て消したい

    シート状に複数のグラフ(散布図)が作られてます. これの輪郭線をすべて消去したいです. Excel操作でいうと「グラフエリアの書式設定」→「パターン」タブ→ 輪郭を「なし」となります. 一グラフに対して自動記録マクロをとると,次のようになります. これを,ブック上(シート上でなく)にある全てのグラフオブジェクト に対して施したいのですが,その方法がわかりません. Sub Macro1() ActiveSheet.ChartObjects("グラフ 1").Activate ActiveChart.ChartArea.Select With Selection.Border .Weight = 1 .LineStyle = 0 End With Selection.Interior.ColorIndex = xlAutomatic Sheets("Sheet1").DrawingObjects("グラフ 1").RoundedCorners = False Sheets("Sheet1").DrawingObjects("グラフ 1").Shadow = False End Sub よろしくお願い致します。

  • エクセル ボタン マクロ 修正

    Sub 印刷() Dim a As Variant a = MsgBox("印刷しますか?", vbYesNo) If a = vbNo Then Exit Sub With Sheets("1") .Cells.FormatConditions.Delete .PageSetup.PrintArea = Range("A1:K73").Address .PrintOut End With End Sub として使用していたのですが シートをコピーして使用する事になり コピーした際印刷ができなくってしまうため修正したいのですが わからないため教えていただきたいです With Sheets("1")ここの部分を今現在ボタンを置いているシートを選択にしたいのです

  • エクセル VBA

    (1) Sub 印刷() With Sheets("原本") .Cells.FormatConditions.Delete .PageSetup.PrintArea = Range("A1:K73").Address .PrintOut End With End Sub としているのですが ボタンを間違って押した時も印刷がされてしまいます 押したときに 印刷しますか? はい いいえ みたいなのを確認するようにしたいのですが どうすればいいでしょうか? (2) Sub 保存() Dim MySheetName As String MySheetName = InputBox("シート名を入力してください") Sheets("9月1日").Copy After:=Sheets(Worksheets.Count) ActiveSheet.Name = MySheetName Sheets("原本").Range("A1:K73").Copy Sheets("原本").Range("A1") End Sub で原本シートをコピーして新しいシートを作成するプログラムを 作ったのですが、シート名を入力しはいを押すと作成されるのですが キャンセルを押した時も勝手にシートが作成されるのですが キャンセル時は何もシートを作成しないように したいのですが どうしたらいいでしょうか? どちらも教えて貰いながら作成したため 自分で修正できなく困ってます お手数ですがよろしくお願いします

専門家に質問してみよう