• ベストアンサー

エクセルでマクロの記録が再現できない?

他のソフトからエクセルに取り込んだデータの頭についているシングルクオーテーションを削除するための手順(1を乗算する)を以下のようなマクロの記録にしました。⇒Sub Macro4 これを汎用で使えるように編集しました。⇒Sub SQ_Delete ところが、手動ではちゃんと削除されたシングルクオーテーションがSub SQ_Deleteでは消えてくれません。 それどころか。記録したSub Macro4を走らせても消えないのです。 試行錯誤の結果、Paste:=xlAllExceptBorders を、Paste:=xlAll にすれば大丈夫なことはわかったのですが、それでは罫線が消えてしまいます。 手動で削除できた方法(Paste:=xlAllExceptBorders)で、なぜVBAではだめなのかが大きな疑問です。 よろしくお願いします。 Sub Macro4() Range("D18").Select ActiveCell.FormulaR1C1 = "1" Range("D18").Select Selection.Copy Range("A1:D12").Select Selection.PasteSpecial Paste:=xlAllExceptBorders, Operation:=xlMultiply, _ SkipBlanks:=False, Transpose:=False End Sub Sub SQ_Delete() Set ds = ActiveCell.SpecialCells(xlLastCell).Offset(1) ds.Value = 1 ds.Copy Selection.PasteSpecial Paste:=xlAllExceptBorders, Operation:=xlMultiply ds.Delete Application.CutCopyMode = False Set ds = Nothing End Sub

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

  • ベストアンサー
  • taocat
  • ベストアンサー率61% (191/310)
回答No.2

こんにちは。 相変わらず色んなことにトライしてますねぇ。 感心します。 ヘルプ、ご覧になりましたか? そこに答えが!(^o^)/~ ------------------------------------------   xlAllExceptBorders ではなくて   xlPasteAllExceptBorders ------------------------------------------ それから、このことについては マイクロソフト技術情報サイトにも載ってますが、 それはご自分で探してみませう。。(^^; 以上です。

merlionXX
質問者

お礼

あ、taocatさま、先日のご助言ありがとうございました。おかげさまで高速化に成功しました。(http://odn.okwave.jp/kotaeru.php3?q=2200236) この方法でいいんですよね?実証データも載ってますのでアドバイスいただけると幸いです。 VBEのヘルプ見ました。 「使用できる定数は、XlPasteType クラスの xlPasteAll、xlPasteFormulas、xlPasteValues、xlPasteFormats、xlPasteNotes、xlPasteAllExceptBorders のいずれかです。既定値は xlPasteAll です。」となってました。すみません。 でも、どうしてマクロの記録ではxlAllExceptBordersやxlAllとでるのでしょうね?バグでしょうか? ・・・・と思ったら、 > マイクロソフト技術情報サイトにも載ってますが、 > それはご自分で探してみませう。。(^^; という、道士様のありがたいお言葉でしたので、 http://support.microsoft.com/default.aspx?scid=kb;ja;415379 [XL2000]マクロ記録でPasteSpecialの引数Pasteが正しく記録されない も発見することが出来ました。 これからもご指導のほど、よろしくお願いもうしあげまする。

その他の回答 (5)

  • taocat
  • ベストアンサー率61% (191/310)
回答No.6

こんにちは。 技術情報、見つけたようですね。 どうですか? あっさり教えてもらうより、自力解決の方が喜び倍増でせう?(^o^)~~ ん? と思ったら、 (1) 先ず、ヘルプ。 知ってると思ってるものでも意外と新しい発見があるものです。 (2) 次に、マイクロソフト技術情報サイト。 merlionXXさんのスキルを持ってすればここまでで殆ど解決するはずです。 たぶん、いえいえ、きっと。 (3) 次に、ネット検索。 (4) そして最後に、渋々ながらの質問。 ●「自力解決」がスキルアップの最短コースである!(^o^)!     それから、「高速化」。 よく気づきましたね、Find♪ ああいった場合は、Findはとても速いです。 ただそれで満足してはいけません。 速度、可読性、美しさにおいてFindよりさらに上をいくものがあります。 色々トライしていくうちにきっとそれにも気づくことでせう。 何れにしろ自力解決、おめでとうございまする。 「てんがらもん」でした。(^o^)/~~ (注)「てんがらもん」とは当地の方言で「お利口さん」のことです。   これからもスキルアップの為に色々なものにトライしてみてくださいな。 以上です。  

merlionXX
質問者

お礼

ありがとうございます。 自力解決が出来ればいいのですが・・・。 わたしはヘルプを見てもなかなか理解できないんですよ~。 マイクロソフト技術情報サイトはなかなか検索できないし。 それでついつい頼ってしまいます。すみません。 ありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.5

ご質問の趣旨からはずれますが、、、 セルの先頭にある引用符(’)をカットする方法なら、幾つかありますね。 こんな感じでも。 Selection.Value = Selection.Value で値を更新すれば、その際に引用符は無視されて代入される事を利用します。 ただこの方法のままでは、数式まで値になってしまうので、多少工夫してます。 Option Explicit Sub Drop_SingleQuotationMarks()      '-----------------------------------------------------------------   ' @Description: セルの先頭にある引用符(’)をカット   '-----------------------------------------------------------------   Dim rngTarget As Range   Dim rngArea  As Range        Const ALL_TYPE = xlErrors Or xlLogical Or xlNumbers Or xlTextValues      Set rngTarget = ActiveSheet.UsedRange   rngTarget.NumberFormat = "General"   Set rngTarget = rngTarget.SpecialCells(xlCellTypeConstants, ALL_TYPE)   For Each rngArea In rngTarget.Areas     rngArea.Value = rngArea.Value   Next rngArea   Set rngTarget = Nothing End Sub

merlionXX
質問者

お礼

すばらしいやり方をありがとうございました。 ただ、rngTarget.NumberFormat = "General" とするとあたまの0が消えてしまいます。"@"とするとすべて文字列になってしまいます。 For Each にのところで一個ずつ判定して書式設定するしかないのでしょうか?(それも大変そうですが)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

>データの頭についているシングルクオーテーションを削除するための・・ このことをやるために、質問の方法をとることそのものに、疑問あり。質問者の自由ですかね。

merlionXX
質問者

お礼

この方法は、下記ぺージで見つけた方法なんです。 ↓ http://www.relief.jp/itnote/archives/000321.php imogasiさんのおすすめの方法はどんなのでしょうか? ご教示いただければ幸いです。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

横レス失礼します。 > ...ためしにPaste:=7としたら機能しました。7もいいんですか? XlPasteType クラスに Const xlPasteAllExceptBorders = 7 と定義されてますので、OK です。このような場合の対処法としては、 1. VBE で F2 キーを押して、オブジェクトブラウザを開きます。 2. PasteSpecial を検索します 3. 今回は Range が対象なので、Range クラス の PasteSpecial   を選択します 4. 下側に引数とか、定義とかいろいろでてきます。いろいろクリック   してみて下さい。 メソッドとかプロパティーとか定数とか、、調べるなら ヘルプ → オブジェクトブラウザ の順ですね。

merlionXX
質問者

お礼

KenKen_SPさま、いつもありがとうございます。 調べ方をご教示いただきありがとうございました。 今後ともよろしくご指導くださいませ。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>手動で削除できた方法(Paste:=xlAllExceptBorders)で、なぜVBAではだめなのかが大きな疑問です。 VBAのバグかも知れませんね。 記録マクロでは定数(xlAllExceptBorders)で記録されても、実行時には定数として機能しないでエラーになる事を以前に確認しています。(Excel2000) 定数名(Paste:=xlAllExceptBorders)の変わりに、数値(Paste:=6)で記入すると機能すると思います。

merlionXX
質問者

お礼

さっそくありがとうございました。 バグですかあ! エクセル2000ですが、Paste:=6ではきのうしませんでしたが、ためしにPaste:=7としたら機能しました。7もいいんですか?

関連するQ&A

専門家に質問してみよう