• ベストアンサー

VBAの記述方法

毎月下記のような処理をしたい。 (1). 30シートの中からその月に必要なシートのみを別ブックにコピーし作成する (2). (1)で作成したシートの不要行(A列B列)を削除する (3). (1)で作成したシートのマクロボタン(5個)を削除する (4). (1)で作成したシートのリンクを削除する(コピー元のリンクは保持) その為に下記のようなマクロを作ってみました Sub リンク解除() マクロ記録日 : 2006/3/4 ユーザー名 : isekaoru (1). ActiveWorkbook.ActiveSheet.Copy (2). Columns("A:B").Select Selection.Delete Shift:=xlToLeft (3). ActiveSheet.Shapes("AutoShape 4").Select Selection.Cut ActiveSheet.Shapes("AutoShape 5").Select Selection.Cut ActiveSheet.Shapes("AutoShape 3").Select Selection.Cut ActiveSheet.Shapes("AutoShape 2").Select Selection.Cut ActiveSheet.Shapes("AutoShape 1").Select Selection.Cut (4).ActiveWorkbook.BreakLink Name:= _ "C:\Documents and Settings\ isekaoru\My Documents\17年度計表 .xls" _ , Type:=xlExcelLinks Range("A1").Select End Sub 御教示頂きたき事 1.多数のブックに共通で使用出来るようにしたい 2.(2)~(3)のマクロ本来の記述方法 3.(4)の共通に使用出来る記述方法 * 編集(E)→リンクの設定(K)→リンクの編集画面のリンクの解除(B)をマクロに写したものです。 VBAの記述は出来ない初心者です、御指導宜しくお願い致します。

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

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

>VBAの記述は出来ない初心者です、 とおっしゃっているが(その通り、selectの多用などマクロの記録をするレベルのように見える)、問題そのものは、上級の問題のように思います。他ブックにわたると、色々難しいことが出てくると思います。 最近エクセルの質問で、初心者なのに、頭だけ・したいことだけ前に進んで、難しい質問を出している例が多いようです。難しいかどうかも、勉強しないとわからないので、言ってもしょうがないのですが。 ーーーー 質問を私なりに表現すると、 今開いているるブック(30シート程ある)の、あなたが選んだ1つだけのシートを、別の新規ブックをつくり、そのブックの1つのシートに貼り付ける。 新規ブックの貼り付けた先のシートで、質問の(2)、(3)、(4)の処理をして、新規ブックに名前を受けて、フォルダを指定して、保存したいようですね。 これでよいですか。 選ぶシートは、毎月多いのでしょうか、一斉にしたいのか、個別実行で良いのでしょうか、書いてない。 >多数のブックに共通で使用出来るようにしたい この意味がどういうことかわからない。 ーーーーー Sub test01() Dim NB As Workbook Set NB = Workbooks.Add '------コピー Workbooks("Change範囲.xls").Activate 'A Worksheets(1).Range("A1:H40").Copy 'B '------貼り付け NB.Worksheets(1).Activate ActiveSheet.Paste '-----修正 With ActiveSheet .Columns("A:B").Delete .DrawingObjects.Delete '全ての貼り付けオブジェクト削除でよいとき C .Cells.Hyperlinks.Delete '全ての貼り付けオブジェクト削除でよいとき D End With '------保存 NB.SaveAs "NewBook.xls" 'E Workbooks("NewBook.xls").Close Application.CutCopyMode = False End Sub このA,B,C,Dは固定(上記)でよいのか、質問と違うのか、その都度指定するのか。それによっては、また一段と難しくなりったり、チェックが必要になります。 http://www.moug.net/skillup/nksw/nksw03-01.htm を参考にしましたが、このMougの本やWEBで言っていること(これ以外の事項も)身近になるレベルになればこういう質問をVBAでやる段階になったということ思います。

isekaoru
質問者

お礼

御指導有難う御座いました。

isekaoru
質問者

補足

要領の得ない質問にに対し、長文の御指導、御叱責賜りました事厚く御礼申し上げます。 質問者としては、行と列を間違うなど大変なミスをしてしまいました。 深くお詫び申しげます。 初心者なのに、頭だけ・したいことだけ →御叱責の通りその最たるものです。 質問を私なりに表現すると、 → はい、その通りです。 個別実行で良いのでしょうか、→ はい >多数のブックに共通で使用出来るようにしたい 3.(4)の共通に使用出来る記述方法 (4).ActiveWorkbook.BreakLink Name:= _ "C:\Documents and Settings\ isekaoru\My Documents\17年度計表 .xls" _ , Type:=xlExcelLinks * 編集(E)→リンクの設定(K)→リンクの編集画面のリンクの解除(B)をマクロに写したものです。 この部分{ "C:\Documents and Settings\ isekaoru\My Documents\17年度計表 .xls" _}が 異なるブック名でも同じ名前で記述する事が可能でしょうかという意味です。 このブック(名称A)の1シートからコピーして新しいブックを作成する時、 新しいブックに、このブック名が記述されていますが、このリンクを解除したい。 次に、異なる名前のブック(名称B)を同様の処理をする時、 (名称A)のVBAを(名称B)に貼付けて処理をしたいという意味です。 ブックが異なる都度、変更しなくても良い代名詞のような記述の方法がありますかと言う意味です。 くどくなってしまい申し訳御座いません 個人的な事情(年齢等・・・)もあり、VBAで記述するような事は、これが最後だと思いますので、 方法が有るのか、無いのか、有れば記述を御教示下さい。 宜しく御願い致します。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

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

#3のWendy02です。 書き忘れていましたが、Ctrl キーを押しながら、シートタブをクリックして、複数のシートを選択してから、マクロを起動させます。 起動させるのは、当面は、F8 で、マクロ名を選んでクリックすればよいのですが、最終的に、それでよいとなったら、 表示-ツールバー-ユーザー設定 コマンド(タブ)-マクロ-ユーザー設定ボタン ドラッグして、メニューバーに持ってきて、そのまま、右クリック-選択したボタンの編集-マクロの登録 で登録させます。 そこまでには、長い道のりになるかもしれませんが、がんばってくださいね。

isekaoru
質問者

お礼

要領の得ない質問にに対し、長文の御指導、励ましのお言葉有難う御座いました。 また、御多忙のところ、2度にわたり、御指導頂きました事厚く御礼申し上げます。

全文を見る
すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 ご自身で考えようとされている方なら、いずれは、何とかなると思います。 ただ、今、私は、別のことをやって集中力をなくしているので、自信がまるっきりありません。どこかにミスがあるかもしれませんが、ご質問の内容が、解決までにはなかなか道が遠そうなので、サンプルを作ってみました。 >1.多数のブックに共通で使用出来るようにしたい は、Personal.xls の標準モジュールに登録して、ツールボタンなどにつければよいのではないでしょうか? 後は、ActiveBook とそうでないブックの違いなのですが、他のブックが開かれていなければ、新たにブックを作り、そうでなければ、目ぼしいひとつにコピーされるという仕組みを考えました。ですから、確実にするには、ブックは二つ開けてください。それ以上ですと、開いた順のブックが設定されてしまいます。 ActiveBookが、コピーされる側になった場合は、データがある場合はコピーされないように作っています。あくまでも、参考程度にしてください。 '<Personal.xls の標準モジュール> '--------------------------------------------------- Sub SelectedSheetCopy()   Dim OpWb As Workbook   Dim sh As Object   Dim Shts As Sheets   Dim i As Long   Dim j As Long   Dim CopyFlg As Boolean   Dim cnt As Long   Const LINKNAME = "C:\Documents and Settings\ isekaoru\My Documents\17年度計表 .xls"     On Error Resume Next   Set Shts = ActiveWindow.SelectedSheets     For i = 1 To Workbooks.Count    If Not StrConv(Workbooks(i).Name, vbLowerCase) Like "personal.*" Then      If Workbooks(i).Name <> ActiveWorkbook.Name Then       Set OpWb = Workbooks(i)      End If    End If   Next i   If OpWb Is Nothing Then    If MsgBox("もう1つのブックが開いていないので、新たに作りますか?", vbInformation + vbOKCancel) Then      Set OpWb = Workbooks.Add      Else      Exit Sub    End If   End If   '空白のシートを探す   Do   For j = OpWb.Sheets.Count To 1 Step -1    If WorksheetFunction.CountA(OpWb.Worksheets(j).Cells) > 0 Then     Exit Do    End If   Next   Loop Until j = 0   j = j + 1   For Each sh In Shts    CopyFlg = False    If OpWb.Worksheets.Count >= j Then      If WorksheetFunction.CountA(OpWb.Worksheets(j).Cells) = 0 Then       sh.Cells.Copy OpWb.Worksheets(j).Range("A1")       cnt = cnt + 1       CopyFlg = True      End If      Else      OpWb.Worksheets.Add After:=OpWb.Worksheets(j - 1)      If WorksheetFunction.CountA(OpWb.Worksheets(j).Cells) = 0 Then       sh.Cells.Copy OpWb.Worksheets(j).Range("A1")       cnt = cnt + 1       CopyFlg = True      End If    End If    If CopyFlg Then      WorksheetArrange OpWb, j    End If    j = j + 1   Next sh   OpWb.BreakLink Name:=LINKNAME, Type:=xlExcelLinks   MsgBox CStr(cnt) & "枚のシートをコピーしました!"  End Sub Sub WorksheetArrange(wb As Workbook, j As Long)  With wb   .Worksheets(j).Columns("A:B").Delete Shift:=xlToLeft   On Error Resume Next   .Worksheets(j).Shapes.Range(Array(1, 2, 3, 4, 5)).Delete   On Error GoTo 0   Application.Goto .Worksheets(j).Range("A1")  End With End Sub '---------------------------------------------------

全文を見る
すると、全ての回答が全文表示されます。
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

多数のブックに共通で使用は出来ないと思いますが・・・。 現在のシートを新たに作成された別ブックにコピーし、要望の動きをするマクロのサンプルを作成してみました。 Sub TEST01() With ActiveSheet .Columns("A:B").Delete .DrawingObjects.Delete .Cells.Hyperlinks.Delete .Copy End With ActiveWindow.Close End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • Yosha
  • ベストアンサー率59% (172/287)
回答No.1

大変お困りのようですが、あなたのご質問に直接お答えすることに躊躇します。何故かといえば、質問の内容に不備があります。例えば >1.多数のブックに共通で使用出来るようにしたい とありますが、あなたの書かれているマクロの >ActiveWorkbook.ActiveSheet.Copy は 実行してみるとわかりますが、新規のブック(ブック名はエクセルが勝手につけます)に選択したシートがそのままコピーされます。すなわち、「多数のブックに共通で使用出来るように・・・」したいのなら、引数に具体的なブック名、シート名が必要となります。 また、(2)の >Columns("A:B").Select Selection.Delete Shift:=xlToLeft も 自動でマクロを作らせるとこうなりますが、Select を省いて Columns("A:B").Delete Shift:=xlToLeft でも同じ結果になります。更に Shift:=xlToLeft も省けます。しかし目的によっては Select も Shift 以降も省かないほうが良いときもあります。それに 近い将来、Columns("A:B") も n=2 Range(Columns(n),columns(n + 1)) と変数で列を指定することが必要となります。 だから、ここで何とか汎用のマクロを作り、お教えしても理解できなくてまた質問を、その回答が理解できなくてまた質問をと繰り返す結果にもなりかねません。 そこで、まずテスト用のマクロで各項目を1つずつ実際に動かしてどうなるかを自分で確かめて見るようにしましょう。そのとき必要なのが VBA Super Master のような参考書です。エクセルのヘルプでもありますが、かなりの下勉強をしないと多分これが理解できないと思います。また、VBAで検索すると多数のWebが引っかかります。これらにはいろいろと具体的に記述さてたものが多くあり大変役立ちます。 揚げ足を取るようですが、>(1)で作成したシートの不要行(A列B列)を削除する は「不要列」です。行(横並び)と列(縦並び)とを言葉の上でもはっきり区別するようにしましょう。混乱を招きかねません。ミスをおかす原因の1つとなります。 くどくど書きますたが、要は、自分でマクロの動作を確かめるのが原点になります。そして同じマクロでも何通りの記述方法があります。自分でちゃんと動くまで手直しをする。その上どうしても助けが必要なときは、その部分だけをなるだけ具体的に質問されることをお奨めいたします。そうすればきっと多くの回答が寄せられると思いますし、結果も早く得られるのでないでしょうか。 VBAもけっこう奥が深いようです。いろいろやってみるしかありません。第1の関門を突破すればある程度までスーといけます。頑張ってください。

isekaoru
質問者

お礼

要領の得ない質問にに対し、長文の御指導、御叱責賜りました事厚く御礼申し上げます。 揚げ足を取るようですが> とんでも御座いません、質問者としては、行と列を間違うなど大変なミスをしてしまいました。 深くお詫び申しげます。 リンク解除はマニュアルで行います。有難う御座いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBAの記述方法の質問です。

    エクセルです。12個のセルの文字列をオートシェープの吹き出しに順に表示させるマクロをつくりました。 Sub tenki2() Dim i As Integer Dim a As String For i = 1 To 12 a = Cells(i, 2).Value ActiveSheet.Shapes("AutoShape 4").Select Selection.Characters.Text = a Application.Wait Now + TimeValue("00:00:05") Next i End Sub これで思った通り表示されるのですが、できればオートシェープをセレクトしないようにしたいのです。 (シートを保護するため) それで ActiveSheet.Shapes("AutoShape 4").Select Selection.Characters.Text = a のところを ActiveSheet.Shapes("AutoShape 4").Characters.Text = a と変えたのですが、「オブジェクトはこのプロパティまたはメソッドをサポートしていません」という実行時エラーがでてしまいました。書き方のどこがまずかったのでしょうか?ご教示いただければ幸いです。

  • VBAのGroup化について

    お世話になります。以下のマクロがうまく動きません。 ------------------------------------------------- Dim objShp1 As Shape For Each objShp1 In ActiveSheet.Shapes If objShp1.Name = "Picture 3" Then ActiveSheet.Shapes.Range(Array("A", "B", "Picture 3")).Select Selection.ShapeRange.Group.Select Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 Else ActiveSheet.Shapes.Range(Array("A", "B")).Select Selection.ShapeRange.Group.Select <---------(1) Selection.ShapeRange.ThreeD.RotationX = -180 Selection.ShapeRange.IncrementLeft 0 Selection.ShapeRange.IncrementTop 0 End If Next ------------------------------------------------- このマクロは全体の一部分になりますが、(1)のところでエラーになります。 どこが間違っているのか、さっぱりわかりません。 すみませんが、お助けいただければ幸いです。

  • Excel(エクセル)で非表示シートをVBAで計算するには?

    よろしくお願いします。 エクセルで1つのブックにAシート~Fシートまであるとします。 再計算させると、すべてのシートを再計算してしまうため時間がかかるので、マクロの自動記録を利用して「Aシート→Bシート→Cシート→Dシート→Eシート」と、必要なシートだけを順番に計算させる事で、処理時間短縮をさせる事をする事ができました。 EシートとFシートは表示させておいて、その他のA~Dシートは非表示にしました。 Eシートには、A~Dシートで計算した結果が表示されるようになっています。 ですが、A~Dシートを非表示にして作成したマクロを実行すると、エラーが出てしまい上手くできません。 A~Dシートを非表示にしていても、ブック全体を再計算させる事はできます。 非表示にしたシートをマクロで計算させるには、どのようにしたら良いでしょか? アドバイスをお願い致します。 登録したマクロは下記のようになっています。 Sub 計算() Sheets("Aシート").Select ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Sheets("Bシート").Select ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Sheets("Cシート").Select ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Sheets("Dシート").Select ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Sheets("Eシート").Select ActiveWorkbook.PrecisionAsDisplayed = False ActiveSheet.Calculate Sheets("Eシート").Select End Sub

  • VBAで、エクセルワークシート上の図を選択・削除したい

    VBAで、ワークシート上の図をすべて選択して削除するのは、どのように書いたら良いでしょうか?実際の図は一つなのですが、オートマクロで記述すると、 ActiveSheet.Shapes.Range(Array("Picture 3").Select のように、番号が変わってしまいます。

  • ExcelVBAで画像をシートに貼り付けたり、張り付いた画像を削除した

    ExcelVBAで画像をシートに貼り付けたり、張り付いた画像を削除したりするとき マクロの自動記録で次のようにしています。 1.貼り付け ActiveSheet.Pictures.Insert(画像ファイル名).Select 2.削除 ActiveSheet.Shapes("Picture n").Select Selection.Cut "Picture n"のnは数値です。この数値がどんどんカウントアップされます。 カウントアップされると、このブックを閉じないで使い続けていると10万でも100万でもカウントアップされてしまうのでしょうか? "Picture n"ではなく、「画像ファイル名」とか、任意に設定した名称で指定することはできないでしょうか? よろしくお願いします。

  • マクロ実行時、非表示シートを表示させたくない

    ファイル[testBOOK]の中に(sheet1)(sheet2)があり (sheet2)は非表示,ブック保護されています。 (sheet1)にあるマクロAAボタンで ・[図A]を非表示 ・[図B]を表示 ・マクロBBを実行 するようになっています。 --------------------------------------- Sub AA() '≪非表示≫ ActiveSheet.Shapes("図A").Visible = False '≪表示≫ ActiveSheet.Shapes("図B").Visible = True 'ブック保護解除 ActiveWorkbook.Unprotect 'マクロBB実行 Sheets("sheet2").Visible = True Sheets("sheet2").Select Application.Run "testBook.xlsm!BB" ActiveWindow.SelectedSheets.Visible = False 'ブック保護 ActiveWorkbook.Protect End Sub ---------------------------------------- マクロBBとは[sheet2]の中にある ・[図A]を非表示 ・[図B]を表示 です。 上記のマクロを実行させると(sheet2)が瞬間的に表示されてしまうのですが、 これを表示させないようにすることはできないでしょうか?

  • EXCEL VBA これであっていますか?

    エクセルに地図を貼り付け、その中のある地点Aから半径1キロ、2キロ、3キロといった具合に円を描いています。ある地点B、Cも同様に円があります。セルに“A” と入力した際に該当する地点の円(1キロ、2キロ、3キロの3種類)を赤く表示し、終了すると円が消える(線なしに変わる)ようにするために以下のようなVBAを組みました。が、円が2つしか赤くならなかったり、 ばあいによっては「インデックスが境界を超えています」とエラーが出たりします。 どうしたら良いか教えてください。 Sub iro() Dim i As Variant i = InputBox("表示する地点を指定してください", "地点指定") If i = "A" Then ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(1).Select ActiveSheet.Shapes(2).Select ActiveSheet.Shapes(3).Select Replace:=False modosu ElseIf i = "B" Then ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False hyoji MsgBox "表示を終了してよろしいですか", vbOKOnly ActiveSheet.Shapes(4).Select ActiveSheet.Shapes(5).Select ActiveSheet.Shapes(6).Select Replace:=False Else MsgBox "指定した地点がありません", vbOKOnly End If End Sub Sub hyoji() Selection.ShapeRange.Line.Visible = msoTrue '「線なし」に設定されている場合、線を表示 Selection.ShapeRange.Line.ForeColor.SchemeColor = 10 Range("A1").Select End Sub Sub modosu() Selection.ShapeRange.Line.Visible = msoFalse '「線なし」に設定 Range("A1").Select End Sub

  • 図形 Selectionが省略できない VBA

    「タイトル」という名の図形はシート上に存在するのですが、 Sub a() ActiveSheet.Shapes.Range(Array("タイトル")).ShapeRange.Height = 110 End Sub Sub b() ActiveSheet.Shapes.Range(Array("タイトル")).Select Selection.ShapeRange.Height = 110 End Sub aだとエラーになりますが、 bだと正常に動きます。 SelectやSelectionは省略できるものだと思ってるのですが なぜaだとエラーになるのでしょうか? 一度図形をアクティブにする動作が必要なのですか?

  • VBA シートをコピー後、ボタンにマクロ登録

    お世話になっております。 Excel2003を使用しております。 分かる人にはすぐ分かる問題かもしれませんが、 良くわからないため教えて下さい。 シートを別ブックにコピーします。(ここまでは出来ています。) 元々あったボタンを選択し、 マクロを登録しなおそうとするも、上手く行かず… Dim StaticBook as Workbook と宣言し、 コピー先のブックを選別?できるようにしています。 そのため、シートをコピーした後に With StaticBook.ActiveSheet   .Shapes("Button 1").Select      Selection.OnAction = StaticBOOK.Name & "!Sheet2.保存_Click" .Shapes("Button 2").Select Selection.OnAction = StaticBOOK.Name & "!Sheet2.再編集_Click" .Range("A1").Select End With としてみたのですが、エラーが表示されます。 ButtonクラスのOnActionプロパティを設定できません。と表示されます。 元々、コピーすれば上手く動くとおもっていたのですが、 ボタンをクリックしたときの参照先が コピー元のブックのままになっておりこれの改善方法がしりたいのです。 調べてみてもあまり良く分からず… 回答お願い致します!

  • excel vba

    (1)下記のマクロに出てくるApplication.CutCopyMode = False というのは何でしょうか。 (2)また自分でマクロ記録してあるシートを、別のシートにコピーしたとき Application.CutCopyMode = False Selection.Copy というのが、付くときとつかないときがあったんですがなぜそのようなことがおきるのか。 (3)またSelection.Copyというのは何ですか。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2007/1/11 ユーザー名 : ××××× ' ' Workbooks.Open Filename:="C:\aaa\bbbbb\cccc\aaaa_1.xls" Columns("H:H").Select Application.CutCopyMode = False Selection.Cut Columns("E:E").Select Selection.Insert Shift:=xlToRight Columns("I:I").Select Selection.Cut Columns("G:G").Select Selection.Insert Shift:=xlToRight With Selection.Font .Name = "MS 明朝" .Size = 10 .Strikethrough = False .Superscript = False .Subscript = False .OutlineFont = False .Shadow = False .Underline = xlUnderlineStyleNone .ColorIndex = xlAutomatic End With ActiveSheet.PageSetup.PrintArea = "$A$1:$L$61" ActiveWorkbook.Save End Sub

専門家に質問してみよう