アプリ版:「スタンプのみでお礼する」機能のリリースについて

Excel2003 の名前を付けたセルのコピーについて質問です。
例えばI列より左側には大量のデータがあって、J列より右にはそのデータのまとめを作ったとき、

J3を基準として、J3、J4、K3にそれぞれ結果1、結果2、結果3という名前を付けるとします。
VBAマクロでこの結果1、2、3を読み込ませているのですが、このファイルを雛型として、別のファイルにもこの「データのまとめ」エリアとマクロをコピーするとき、いつもJ3を基準とするとは限らないので困っています。

データの数によっては基準がL3になったりしてもかまわないようにしたいのです。
ところが、J~K列を新しいブックのL列へとコピーすると、J3、J4、K3のセル内容はL3、L4、M3に当然コピーされるのですが、
結果1、結果2、結果3という名前のついたセルはJ3、J4、K3のままなので、困っています。

マクロで「L3を結果1と呼ぶ」
ActiveWorkbook.Names _
.Add Name:="結果1", _
RefersToR1C1:="=Sheet1!R3C12"
という方法しか解決策はないでしょうか?

マクロを使わなくても、コピーペーストのやり方次第でL列でもP列でも任意の列に「名前のついたセル」をセルごと持っていく(名前だけが別のセルにならない)、という方法があれば、一番簡潔(マクロを組まなくて良い)ので特にありがたいです。よろしくお願いします。

(自力で検索して同様の質問は見つけられなかったのですが、既出でしたら、検索方法やリンクや参照ページだけでも教えていただけたらありがたいです。)

A 回答 (6件)

「名前」も、あくまで「絶対参照」。

セルに"=$A$1"と書くのと同じなので、コピー時に参照元(対象)が変わっちゃ困りマスね。

で、どーすればよいか。
 1. 「参照元」をカット&ペーストでズラす ←☆
 2. 名前を「式」で作り、相対っぽくする
 3. VBAで特別な処理を作る

☆1。同一シート内に限り、参照元をカット&ペーストで移動できます。名前"=$A$1"なら、A1をカットしB1にペーストすれば、"=$B$1"に。
そこで、J3→別シートJ3にコピーした後、J3→L3にカットで移動。J3にデータがある場合は、新規Bookで仲介したらいいです。絶対参照ズラすのによく使う手。
こんなんじゃダメかな・・・?

2。名前には、OFFSETやMATCHなどの関数が使えます。一定範囲内で見出し「合計」のセルを探して・・・とか、曖昧な参照も可能。でも、デリケートで扱いづらいためオススメしません。

3。地味にめんどくさい・・・デスヨ。
    • good
    • 0
この回答へのお礼

ap_2さん、ご回答ありがとうございます。
急いでいますの区分にしていたのに、お返事が遅くなって誠にすみません。先週末は、「このまま0件か…1週間経ってから上げ直すしかないか」とあきらめていただけに、古い(数日経った)私の質問を取り上げてくださったことが、誠にありがたいです。

さて、No.1 と No.3 の両方にまとめてお礼させていただきますが、長文で真摯にご回答いただいた上に再訪問していただいてフォローしていただいたことにたいへん感謝しております。

1の方法は、私もよく利用する方法です。
J列ではなくてL列を基準にしたいときには2列わざと挿入したり、
名前のついたセルをドラッグで連れ回したりして、参照を自動で変更させています。
ただ、これは手作業が加わる解決法なので、上司には提案できませんでした。(ボタン一つでポン! みたいなものを作って、という要望だったので。)

しかも、上司が使うデータファイルにはいろいろなパターンがあるそうなので、安易にマクロで「delete」などの上書き系のコマンドを使えない、という制約がありました。説明が後になったことをお詫びいたします。


>「「名前」も、あくまで「絶対参照」。」

これは今回初めて知りました。
Excelの設計者は、何か狙いがあってあえて、名前だけは相対的に移動できないようにイジワルを仕組んでいるんでしょうか。グラフ関係にも似たような絶対参照がありますね。
VBAでプロパティから 名前の付いているセルの情報を拾おうとしたのですが(それができれば、$L$3 を L3 に買えれば一発解決と思ったのです)、知識・技量不足でわかりませんでした。


2の方法も、今回初めて知りました。
ありがとうございます!
今後かなり活用できそうです。
今回は、結果1(例えば Average)や結果2(例えば Max)などのセルを別のマクロで読み込ませるので、
名前を関数にする、
というメリットを最大に活用する方法は残念ながら思いつきませんでした。
デリケート、そうおっしゃる意味を私も100%感じ取れたことを願っています。

3の方法。
めんどうでしたけど、この道を選びました。
No.3へのお礼で詳述させていただきます。
めんどうとおっしゃいながら、再度ご回答をくださったこと、その恩に応えられなかったことに、頭が下がる思いです。

お礼日時:2012/08/30 17:34

雛形の名前つきセルのあるシートをコピーしてそこにデータを貼り付けるのがもっとも簡明だと思いますが、おそらく質問者様のやり方には合わないのでしょうね。



マクロを使わずに名前つきのセルを名前ごとコピーするには、やや手順はかかりますが以下のような方法があります。
1.雛形の名前つきセルのあるシートを名前つきセルを貼り付けたい別のブックにコピーする
(雛形の名前つきセルのあるシートで「セルの移動またはコピー」→「コピーを作成する」をチェック→「移動先ブック名」にて名前つきセルを貼り付けたい別のブックを選択→OK)
2.コピーしたシートから目的のシートへ名前つきセルを移動
(コピーしたシートの名前つきセルを含む領域を選択→切り取り→目的のセルに貼り付け)
3.コピーしたシートを削除

しかしこのような手順を毎回行うくらいなら、名前をつけるマクロを作成したほうが楽で確実だと思います。


ところで、質問文中で1つわからないところがあります。
>結果1、結果2、結果3という名前のついたセルはJ3、J4、K3のままなので、困っています。
このJ3、J4、K3はどのシートなのでしょうか。もしも貼り付け先のセルであれば、あとはセルの移動や行の挿入・削除で名前つきセルを動かすことができます。
しかしこちらでテストしたところでは、単純な列のコピーでは名前はコピーされませんでしたので、おそらくコピー元の雛形のほうなのでしょう。


あとは、たとえばデータのあるセルのどこか一定の位置に名前をつけておき、そこからの相対参照を行う方法もあると思います。
ただし既存のマクロの書き換えが必要になりますが。
    • good
    • 0
この回答へのお礼

queuerev2さん、ご回答ありがとうございます。
急いでいますの区分にしていたのに、お返事が遅くなって誠にすみません。先週末は、「このまま0件か…1週間経ってから上げ直すしかないか」とあきらめていただけに、お二人とも数日経ってからでも私の質問を取り上げてくださったことが、誠にありがたいです。

>質問文中で1つわからないところがあります。
とたずねてくださったのに、その返答が遅れて、本当に失礼いたしました。こちらの都合で、アクセスできなかったことをお許しください。

まずそちらからご回答します。
ブックAのシートB(雛型)から
他人のブックCのシートDに、ある列より右側をコピーしてもらいます。
私はブックCを見ることはないので、ブックCの何列より右に貼り付けるかはわかりません。そのようなブックC候補がたくさんあります。

アドレスは、シートBのJ列より右側を全てコピーして、
シートDのL列にコピーする、という例を挙げさせていただきました。
>こちらでテストしたところでは、単純な列のコピーでは名前はコピーされませんでした
とおっしゃっていましたが、テストまでしてくださってありがとうございます。コピーがされなかった理由は私も後でわかりました。
それは回答No.3のお礼の中に関連情報を書かせていただきました。
「使っていない名前はコピーされない」
「名前がコピーされて欲しければ、名前をわざと使うしかない」
ということのようです。

従って、
>おそらくコピー元の雛形のほうなのでしょう
は、違いまして、
コピー先のほうのことなのですが、
私の知識不足で説明が不足し、混乱させてしまってすみませんでした。

回答No.3のお礼の中に私の書いたコードを書かせていただきました。
>セルのどこか一定の位置に名前をつけておき、そこからの相対参照を行う方法
にかなり近いと思います。
ただ、上司にシートDの中のセルに名前を付けてもらう、ということはできないので、別の回避手段を取りました。


前半で書いてくださいました
>このような手順を毎回行うくらいなら、名前をつけるマクロを作成したほうが楽で確実
という「手順」のことは、本当におっしゃる通りですね。
どんなシートでも、相対座標で名前がコピーペーストされたら(修正作業がいらないようになったら)楽なのに。
でも、私がどこまで知っているかはqueuerev2さんにはわかりませんから、いろいろなご提案をしてくださいまして、誠にありがとうございました。

他に類似の質問が挙がっていない様子なのが不思議です。みなさんあまり、セルの名前は使わないのでしょうか。


なお、
「セルの移動またはコピー」
の機能メニューは見つけられなかったので、
「シートの移動またはコピー」
で代用しました。
これでも良かったでしょうか?


ありがとうございました。
1週間くらい置いておいてから締め切ろうと思います。

お礼日時:2012/08/30 17:36

補足@ANo.1です。



シート間の"名前"の移動は、コピー範囲内で"名前"が使われている場合のみ、かと。ANo.1の1(×J3,○J~L列でした)も、J~L列に、名前つきセルと、名前使用セルを含むことが前提です。ANo.2最後の、相対使って表組みなおす方がスマートかも。

VBAは、ANo.1では面倒と書いたけど・・・使い捨てる分には簡単。作れると楽ですよ。名前コピーされてるならAddじゃ重複します。以下、参考程度に@動くか不明
'貼り付け先を選択してペースト代わりに実行。
Sub sample()
 ActiveSheet.Paste
 n = Selection.Cells(1, 1).Column - Range("J1").column 'コピー元(J?)とのズレ
 With Activeworkbook.Names("結果1")
  .RefersToR1C1 = "=R" & .RefersToRange.row & "C" & .RefersToRange.column + n
 end with
 With ...Names("結果2")
 '以下略
End Sub

汎用的な処理のイメージが沸かず、つい考え込みました。やっぱりコピー元"Book"の判別にすら要ClipBoard操作みたい。あきらめタ!
コード書く気なかったんですが、このもやもやを伝えたくて(--;
    • good
    • 0
この回答へのお礼

No.1のお礼から先にお読みください。

>「シート間の"名前"の移動は、コピー範囲内で"名前"が使われている場合のみ、かと。ANo.1の1(×J3,○J~L列でした)も、J~L列に、名前つきセルと、名前使用セルを含むことが前提です。」

このことも今回初めて知りました。
たいへん勉強になりました。

この質問を後から参照なさる検索者のために、一応私が書いたコードも記録しておきます。

名前を付けたセル5つの名前を
結果1~結果5
としました。

質問で書いた
J3を基準とする
ということを、
「基準点」という値をセルに書き込むことで解決させました。
したがって、新しいブックでL3を基準としたければ
L3に「基準点」という値を書き込む
他のセルには「基準点」という値は書き込まない
というルールを設けております。
あまりスマートではありませんね。

でも実運用上は、「基準点」という値を書き込む作業は、
コピペで終わっているので、後はマクロを一度動かすだけで
名前の付け直しが終わるので、まあまあ解決かな、と思っております。

どこか邪魔にならない適当なセルに

(文字列、数値両方対応)
=結果1&結果2&結果3&結果4&結果5

(数値のみの場合)
=結果1+結果2+結果3+結果4+結果5

と書き込んでおきます。

書き込まなくても良いです。
どうせ後でマクロで新規に名前を付け直すのですから。
でもまあ一応、
結果1~結果5を使っているセルがあると、コピペのときに名前のついたセルも同じ座標にコピーされる
ということで、コピー忘れを防止しています。


以下コード
(Dim など宣言を省いてすみません。)
(J3 などではなく、実際に用いた座標を記しているので、解読しづらかったらすみません。)


Sub sample2()

左上起点を探す:

With Range("A1:BA100")
'A1:BA100 よりも検索範囲を広げるなら適当にいじってください。
'この範囲に「基準点」と書かれていないとダメです。

Set p = .Cells.Find(what:="基準点", Lookat:=xlValue)

End With

If p Is Nothing _
Then

MsgBox ("""基準点""というセルが見つかりません")
Exit Sub

End If

OX = p.Column
OY = p.Row
'O はOrigin, 原点のつもりです。

Set p = Nothing


ShNm = ActiveSheet.Name


メイン:


'K=11
'L=12
'M=13
'R=18
'下記の右端のコメントは、R32C11(K32)を起点とした場合の絶対座標。
'32と11を引き算して相対座標をマクロ内に書き込まざるを得ません
'でした。RefersToRange を用いれば、マクロに数値を書き込む必要も
'なくなると思われます。
'D はΔ(デルタ), 差異(オフセット)のつもりです。

Nm = "結果1": DY = 6: DX = 1 '38,12
GoSub 名付け

Nm = "結果2": DY = 1: DX = 7 '33,18
GoSub 名付け

Nm = "結果3": DY = 1: DX = 2 '33,13
GoSub 名付け

Nm = "結果4": DY = 5: DX = 1 '37,12
GoSub 名付け

Nm = "結果5": DY = 5: DX = 0 '37,11
GoSub 名付け


'(参考:定義された名前の一覧表、R32C11(K32)起点)
'"結果1" ='シート1'!$L$38
'"結果2" ='シート1'!$R$33
'"結果3" ='シート1'!$M$33
'"結果4" ='シート1'!$L$37
'"結果5" ='シート1'!$K$37


Exit Sub

名付け:

ActiveWorkbook.Names _
.Add Name:=Nm, _
RefersToR1C1:="='" + ShNm + "'!R" + CStr(OY + DY) + "C" + CStr(OX + DX)

Return


End Sub


以上でコード終わりです。
かなりヘタクソですみません。

実は、あまりネットにアクセスできなかったので、先にこのコードを書いてしまったのです。
でも、ap_2さんの
 n = Selection.Cells(1, 1).Column - Range("J1").column 'コピー元とのズレ

これかなり良いですね!
自分のコードに生かしていなくて、(ご回答を読めなかったので「質問する意味がない!」と言われそうです。)本当に申し訳ないです。
「基準点」というセル自体がいらないですね。


RefersToRange
の使い方、初めて勉強になりました!

精進します。
また、別の質問に回答することで恩返ししようと思います。
本当にありがとうございました。

お礼日時:2012/08/30 17:39

No.2です。


いただいたお礼に対する返答のみにて新規提案がありませんが失礼致します。

>「セルの移動またはコピー」
>の機能メニューは見つけられなかったので、
>「シートの移動またはコピー」
>で代用しました。
>これでも良かったでしょうか?

「シートの移動またはコピー」が正しいのですが誤記してしまいまし申し訳ありません。
また、質問者様には丁寧なお礼をいただき、質問者様とNo.1,3様の豊富な知識に逆にこちらが勉強になりました。
ありがとうございました。
    • good
    • 0
この回答へのお礼

queuerev2さん、
再度のご訪問ありがとうございます。

私もお二人から得られることが多かったです。
私の長いコメントを細部まで読んでくださり、「新たな質問」ととらえて全てすっきり解決してくださって、ありがとうございました。

またどこかで、今後ともよろしくお願いします。

お礼日時:2012/08/31 13:47

ANo.1&3です。


丁寧なお礼(あまりの長さに笑った)に加え、回答者からもコメントもらって、悪い気はシナイ!見栄はって頑張りたくなっちゃいますw

上司からの要望でしたか、悩ましいですよね^^;

※ もーちょい補足
「名前」という名前が悪い。コレ「定数」です。
セルに名前を・・・ではなく、アドレスに名前をつける機能。そう考えると納得できるかと。

式の中で "名前" が "アドレス" に置き換わるだけなので、コピー時などは セルに"=$A$1"と入力した場合 と同じ扱いになります。
名前使用セルのコピペで名前定義が挿入されるのは、「名前がない!」を避けるためのサービスなんでしょうね。
    • good
    • 0
この回答へのお礼

ap_2さん、
未明の時間帯にもかかわらず気にかけてくださり、ありがとうございます。

No.6は
「現在、この回答はサポートで内容を確認中です。
ご迷惑おかけいたしますが、今しばらくお待ちください。」
となっているので(多重投稿だと人的チェックが入るんでしょうか!? ご不快な思いをさせていて申し訳ございません。)、先にNo.5に対してのお礼を付けさせていただきます。

>「名前」という名前が悪い。コレ「定数」です。
セルに名前を・・・ではなく、アドレスに名前をつける機能。そう考えると納得できるかと。
>式の中で "名前" が "アドレス" に置き換わるだけなので、コピー時などは セルに"=$A$1"と入力した場合 と同じ扱いになります。
>名前使用セルのコピペで名前定義が挿入されるのは、「名前がない!」を避けるためのサービスなんでしょうね。

なるほど! おっしゃっる意味がよーくわかります!
例えばユーザー定義の関数を作るのと、同じ感覚なんですね!

ののちゃんズ計算式 = average * counta

みたいに定義していると、
sum(ののちゃんズ計算式) は自動で
sum(average() * counta())  に読み替えられる
みたいに、

あるいはウィンドウズのブラウザー上で
abc1234567890.txt みたいな「本当の」ファイルネームが
メモ.txt     として表示されるのと同じように、

単に置き換え、をしているだけだから、
アメリカ人の感覚(プログラマーはカナダ人か日本人か中国人か知りませんが)でいうと、相対参照よりも絶対参照の方が、
「何を指しているかがはっきりする」
という背景があったのかな、と勝手に納得しました!


例えばExcelのB列に縦に、
B3 = 2012/9/1
B4 = 2012/9/2

B32 = 2012/9/30
と日付を表にした時に、

平日売り上げ =Sheet1!$E$5:$E$9,Sheet1!$E$12:$E$16,Sheet1!$E$20:$E$23,Sheet1!$E$26:$E$30

平日来客数 =Sheet1!$F$5:$F$9,Sheet1!$F$12:$F$16,Sheet1!$F$20:$F$23,Sheet1!$F$26:$F$30

みたいに定義できるのもおもしろいですね。
F1 = sum(平日来客数)
でちゃんと答えが出るのですから。

「セルに名前を・・・ではなく、アドレスに名前をつける」
そのアドレスは連続でなくて飛び地でも良く、定数を自分で定義できる、というのは、使いこなせば見た目は
「関数などを目で追うのがめんどくさい」
という多数の人にとってすっきり有用になりそうです。
たぶんファイルサイズは膨らむのでしょうけれども。



あとNo.3のお礼に書き忘れましたが、
>名前コピーされてるならAddじゃ重複します。
というご助言は、恐らく、

「違うアドレスに同じ名前を付けるときのこと」ではなく、

「同じアドレスに別の名前を付けるときのこと」

をおっしゃっているのではないでしょうか?
名前は一度付けていると、追加になっていく、ことをおっしゃっていることと思います。
でも今回はAddで問題ないようです。

例えば
J3 = 基準点
と名前をつけているときに
J3 = 基準点1
と名前を「アドレスバー上で」付け直すと、
J3 は 基準点 と 基準点1 の両方の名前を持つ
ことになりますよね。

たまに私も、
B3:E5 = 検索範囲
B3 = 左上ポイント
みたいに、
B3 に2つの名前を付けることがあります。

J3 = 基準点
と名前をつけているときに
L3 = 基準点
と名前をつけようとしてアドレスバー上で 基準点 と入力すると、
L3は何の影響も受けず、カーソルがJ3にジャンプしてしまいますね。

でも、マクロで
   .Add Name:="基準点"
する場合には、
すでに 基準点 が存在していても、Add ではなく、
   新たな 基準点 は J3 ではなく L3 という風に置き換え
となるようです。

ap_2さんの方がずっと知識は上と感じているので僭越で恐縮ですが、
>Addじゃ重複します。
に対する実証結果のアンサーバックとして、お知らせしておきます。
(私がNo.3であえてコピペで名前がコピーされるように細工していた狙いは、
同じアドレスならそもそもマクロを動かす必要がないようにする、というものでした。
確かに、既に存在している名前をもう一度Addで定義するのは、気持ち悪さがあります。)


さて、
>コピー元"Book"の判別にすら要ClipBoard操作みたい
なるほど!
今回の私の場合には、コピー元"Book"は「雛型」ファイルだと決まっているのですが、
汎用性を持たせる場合、マクロで ClipBoard操作 もできるのですか!
コードを考えるとかわかるとか以前に、そのご発想自体が目からウロコでした。


いろいろと惜しみなく教えてくださって、ありがとうございます。

私の方のお礼コメントは、誤字がちらほらあって、校正が不完全で失礼いたしました。(恐らくおわかりになると思うので、逐一の訂正は割愛させていただきます。)



「現在、この回答はサポートで内容を確認中です。」
の件は、8/31 13:40の段階ではまだダメでしたが、
同13:48の段階で解消しました!
長文の コード を付けていただいたのが、人的チェックが入った理由のようですね! なんかここまでしていただいて感激です。

これを投稿した後にNo.6を読ませていただきます。
本日は 社内PCからもうアクセスできなくなってしまったら、お返事は週明けになる可能性もあるので申し訳ございません。
でも、本日中に必ず読ませていただきます。
朝に一生懸命長文回答してくださったのだから、運営も、「一時保留」みたいな水を注すマネはしなかったらいいのに。

本当にありがとうございます。ではまた。

お礼日時:2012/08/31 14:05

ClipBoard操作のコード見つけたんで、ためしに使って作ってみました。


解決済みっぽいけど、自己満足ってコトデ。

WindowsAPIに抵抗ある場合は、コード前半は無視してMyCopyFuncをコメント解除して使用。Copy処理もマクロ化することでコピー元を保持します。Ctrl+Shif+C/Pとかキー割り当てれば、案外使えるかなと。
こんな感じで「絶対参照を無視してコピペ」とか作ると便利かも。

'--> ClipBoard操作する場合ここから
'マクロの使用はペースト時のみでOK
'※アドレス取得まる写し。takanaさんに感謝(-人-)
'ttp://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200910/09100010.txt
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function RegisterClipboardFormat Lib "user32" Alias "RegisterClipboardFormatA" (ByVal lpString As String) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
'コピー元アドレス取得
Public Function GetCopyAddress() As String
 Dim lngFormat&, hMem&, lngSize&, strData() As Byte, i&
 OpenClipboard 0
 hMem = GetClipboardData(RegisterClipboardFormat("Link"))
 If hMem = 0 Then
  CloseClipboard: Exit Function
 End If
 lngSize = GlobalSize(hMem)
 ReDim strData(0 To lngSize - 1)
 MoveMemory(VarPtr(strData(0)), GlobalLock(hMem), lngSize)
 GlobalUnlock hMem
 CloseClipboard
 For i = 0 To lngSize - 1
  If strData(i) = 0 Then strData(i) = Asc(" ")
 Next i
 GetCopyAddress = AnsiToUnicode(strData())
End Function
Private Function AnsiToUnicode(ByRef strAnsi() As Byte) As String
On Error GoTo ErrHnd
 Dim lngSize&, strBuf$, lngBufLen&, lngRtnLen&
 lngSize = UBound(strAnsi) + 1
 lngBufLen = lngSize * 2 + 10
 strBuf = String$(lngBufLen, vbNullChar)
 lngRtnLen = MultiByteToWideChar(0, 0, strAnsi(0), lngSize, StrPtr(strBuf), lngBufLen)
 If lngRtnLen > 0 Then AnsiToUnicode = Left$(strBuf, lngRtnLen)
ErrHnd:
End Function
'※まる写しココマデ
'コピー元Range取得
Private Function GetCopyRange() As Range
 Dim re, mt, adr$
 adr = GetCopyAddress
 Set re = CreateObject("VBScript.RegExp")
 re.Pattern = "Excel .*\[(.+)\](.+) ([RC0-9:]+)"
 Set mt = re.Execute(adr)
 If mt.Count <> 0 Then Set GetCopyRange = Workbooks(mt(0).submatches(0)).Sheets(mt(0).submatches(1)).Range(Application.ConvertFormula(mt(0).submatches(2), xlR1C1, xlA1))
End Function
<-- ClipBoard操作ここまで

'--> WindowsAPIに抵抗あるならコチラ(要コメントアウト)
'コピー操作はMyCopyFuncで。コピーついでにコピー元を保持。
''(名前定義コピペ) コピー処理
'Function MyCopyFunc()
' GetCopyRange Selection: Selection.Copy
'End Function
''Range保持/取得用@グローバル変数でもいいんだけど
'Private Function GetCopyRange(Optional ByVal rng As Range) As Range
' Static target As Range
' If Not (aRng Is Nothing) Then target = rng
' Set GetCopyRange = target
'End Function
'<-- WindowAPIナシ版ここまで

'--> 以下、共通
'(名前定義コピペ) ペースト処理
Sub MyPastFunc()
 Dim nmlist(1 To 100), rng As Range, i&, n&, o
 ActiveSheet.Paste
 'セルコピー以外終了
 If Application.CutCopyMode <> xlCopy Then Exit Sub
 Set rng = GetCopyRange 'コピー元取得
 If rng Is Nothing Then Exit Sub
 'コピー範囲に含まれる名前を取得
 On Error Resume Next 'Range.Nameは有無不明
 For Each o In rng
  Set nmlist(n + 1) = o.Name
  If nmlist(n + 1) <> Empty Then n = n + 1
 Next
 On Error Goto 0
 If n = 0 Then Exit Sub
 Dim dr&, dc&'位置ズレ取得
 dr = Selection.Cells(1, 1).Row - rng.Cells(1, 1).Row
 dc = Selection.Cells(1, 1).Column - rng.Cells(1, 1).Column
 '名前定義の挿入/差替え
 For i = 1 To n
  ActiveWorkbook.Names.Add nmlist(i).Name, "=R" & (nmlist(i).RefersToRange.Row + dr) & "C" & (nmlist(i).RefersToRange.Column + dc)
 Next
End Sub
    • good
    • 0
この回答へのお礼

ap_2さんを初め皆さん、締切が遅くなってすみませんでした。
会社のPCからのアクセスが急に厳しくなったからです、申し訳ありません。
ありがとうございました。

お礼日時:2012/10/05 19:39

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