- ベストアンサー
エクセルVBAで得意先追加の際に一覧シートのB列・D列にシートの各セルをリンク貼付する方法は?
- エクセルVBAを使用して得意先追加を行う際に、一覧シートのB列・D列にシートの各セルをリンク貼付する方法について教えてください。
- 一覧シートのA列にはコード&得意先名があり、B列には今期の売上合計が、D列には前期の売上合計が格納されています。
- 得意先追加を実行している際に、一覧シートのB列・D列に対象のセルをリンク貼付する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
LINERSさん、こんにちは。 最初に、たぶん、こういうのもひとつのシステム開発ですが、これが完成すれば、ご自身のExcel VBAの力も格段に上がっていることだと思います。私自身、単発では、あれこれできても、システム全体というのは、本当に考えてみないことがいっぱいでした。 前回も書きましたが、ここは一期一会ですから、聞ける時に全部聞いてください。私が答えられるは、なんとかお答えしておきます。 さて、本題に入ります。 >B列には今期の売上合計(各得意のシートのP10をリンク貼付), >D列には前期の売上合計(各得意先のP9よりリンク貼付)があります。 これは、固定していますね。 一度、以下を試してみてください。前回のコードが汚くなってきたので、書き換えました。一応、掲示板で書く以上、私のほうも、あまり恥ずかしくないコードにしないといけないと思いましたので、きちんとしました。 >Sheets("一覧").Select >Range("A4").Activate >Selection.End(xlDown).Select この部分だけが、ちょっと気がかりになりました。 これをひとつにまとめる方法は、 Application.Goto Sheets("一覧").Range("A4").End(xlDown) と書きます。 別に、Select があるから、というような理屈ではないのですが、Select自体の切り替わりのロスは、Application.Goto ひとつで済むからです。 しかし、以下の Application.Goto .Offset(1) とは必ずしも、いっしょだとは限りませんので、気に掛かりました。違うようでしたら、上記のコードと置き換えてください。 それから、余談になりますが、 Dim myRng As Range, a ←の 「a」は、私が、前回、変数をチェックするときに使ったもので、たぶん、書き残しだと思います。(^^; 本格的には、デバッグは、ウォッチ式を使ったり、Debug.Print を使ったりしますが、これが、一番簡単なのですね。 '------------------------------------------------------------------------- Sub 得意先追加test() Dim myData As String Worksheets("一覧").Unprotect Sheets("新規").Copy Before:=Sheets(4) With ActiveSheet 得意先シート登録.Show .Name = .Range("A4").Value & .Range("A3").Value .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True myData = .Range("A4").Value & .Range("A3").Value End With With Sheets("一覧").Range("A65536").End(xlUp) .Offset(1).Value = myData .Offset(1).Hyperlinks.Add _ Anchor:=.Offset(1), _ Address:="", _ SubAddress:=myData & "!A1", _ TextToDisplay:=myData .Offset(1, 1).Formula = "=" & myData & "!P10" .Offset(1, 2).Formula = "=" & myData & "!P9" Application.Goto .Offset(1) '※ .Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End With End Sub
その他の回答 (1)
- Wendy02
- ベストアンサー率57% (3570/6232)
LINERSさん、こんにちは。 >最後のデータの2列目と4列目のセルをオートフィルでそれぞれ移したいのですが、 AutoFill は、VBAで使うときは、差を取ったりして、コピーする使い方をしますが、そうでない場合は、Copy でも間に合うと思います。 'AutoFill を使用した場合: .Offset(1, 1).Formula = "=" & myData & "!P10" .Offset(1, 1).AutoFill .Offset(1, 1).Resize(, 2) .Offset(1, 3).Formula = "=" & myData & "!P9" .Offset(1, 3).AutoFill .Offset(1, 3).Resize(, 2) 'AutoFill の引数は、そのセルを含む、Rangeオブジェクトですから、Rangeでくくって、Range(.Offset(1,1),.Offset(1,2)) とも書けばよいのでしょうけれども、面倒なので、Resize(,2)を使用しました。Resizeは、とても便利です。そのセルに対して列の範囲を2に増やすということです。 'Copy を使用した場合 Offset(1, 1).Formula = "=" & myData & "!P10" .Offset(1, 1).Copy .Offset(1, 2) .Offset(1, 3).Formula = "=" & myData & "!P9" .Offset(1, 3).Copy .Offset(1, 4) >Application.Gotoとselectの関係?がわかりません。selectと同じ用途で使え、ロスが少ないという解釈で良いのでしょうか? 大きな違いというのは、SheetのSelect を必要とせずに、シングルラインで書けるというところが魅力でしょうか?セルをダイレクトに指名して、そこにジャンプできるのが便利だと思います。シートをセレクトする分だけ、どうしても、その出現時間の終了を待たなくてはなりませんね。Application.Goto でも、出現時間自体は同じですが、しかし、終了を待たない分だけ、そのロスが少ないわけです。Excelのこうした時間というのは、ほんの1000分の1秒の単位ですが、一般ユーザー自体は分からなくても、常に使っていると、なんとなく、その違いが分かるレベルだと思います。 もちろん、そこまで、Selectを排除する必要もありませんが、VBAは、インタープリタ言語だといわれますが、人によっては、スクリプト言語だといわれるぐらい、文字列自体に左右されるプログラムだと思います。ですから、VBAのひとつのプロシージャは、全体の行を短く、省略できるところは、省略するのが大事だと言われます。
お礼
ご解答感謝します。 すみません週明けになってしまいました。おかげ様で、得意先別売上は完成です。直せる部分はまだまだたくさんあると思いますが、必要な機能は備わったと思います。丁寧に教えていただき本当に有難うございました。 VBAの理解はまだまだなんですが、VBAと一言で言っても、その組み立て自体は何通りかあり、それを習得する難しさも勉強することが出来ました。 また別件でも質問を出していくと思いますのでどうぞ宜しくお願いします。 有難うございました。
お礼
お世話様です!見つけてくださるとは思ってましたが良かった~ そうですね、前回の質問を閉めないほうが良かったと思いました。実は閉めてから後悔してました。 今回から私のほうでもじっくり飲み込み、質問したいことがある程度まとまった段階で次に聞きたいことを上げようと思いますので、一旦時間をください。 おかげ様で[得意先別実績表](Book名です。)は格段に進歩しました。最初の質問を上げた時はまさかここまでこれるとは思いませんでしたのでびっくりしてます。(とは言いつつもほとんどはコピペさせてもらっただけですが・・) 実はこの[得意先別実績表]はVBA無(マクロの記録でのマクロのみ)で今まで使ってはいたのですが、私以外の人間が使えない状態でしたし、得意先別のシートに売上等のデータを入力する際に入力する項目が多く、しかも入力セルが点在していたので入力に時間がかかるので大変使い勝手が悪く困っていました。しかし、おかげ様で、誰でも簡単に使用でき、入力も簡単になったので、ここからは+αのことを考えるのと、教えていただいたことを元にコードをシンプルなものに変える作業をしようと思っています。一旦時間を置いた後(多分明日になります。)、補足で上げようと思いますので、その時はどうぞ宜しくお願いします。
補足
いただいたコードは問題なく稼動しました。ただ、 With Sheets("一覧").Range("A65536").End(xlUp) .Offset(1).Value = myData .Offset(1).Hyperlinks.Add _ Anchor:=.Offset(1), _ Address:="", _ SubAddress:=myData & "!A1", _ TextToDisplay:=myData .Offset(1, 1).Formula = "=" & myData & "!P10" .Offset(1, 2[→3]).Formula = "=" & myData & "!P9" 直しました。 それと、最後のデータの2列目と4列目のセルをオートフィルでそれぞれ移したいのですが、 TextToDisplay:=myData .Offset(1, 1).Formula = "=" & myData & "!P10" .Offset(1, 2).[・・・・・・・・・・・・・・・] .Offset(1, 3).Formula = "=" & myData & "!P9" .Offset(1, 4).[・・・・・・・・・・・・・・・] ここ[・・・]へ書き込むのでしょうか? (offsetの使い方の解釈がわかってないかも?) 私としては、offset(1.2)で2列目を指定して、そこから.End(xlup)してAutoFillを使い~と思い、やってみましたがどうにもわからず質問するに及びました。 それからApplication.Gotoとselectの関係?がわかりません。selectと同じ用途で使え、ロスが少ないという解釈で良いのでしょうか?