質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%

Q&A

2回答

6767閲覧

列を追加したら隣の書式・数式を引き継ぐようにしたい

pyoo001213

総合スコア13

0グッド

0クリップ

投稿2017/09/23 03:04

仕事で急遽頼まれてしまいましたが、どうしても検索しても見つからなかったため投稿させて頂きます。
今までは抜けている関数を手動で挿入していましたが、自動化をしたいとおもっております。

イメージ説明

画像を載せましたが、列を追加したら隣の書式・数式を引き継ぐようにしたいのですが
可能であればマクロを利用しないで設定することは可能でしょうか?
しない理由としてはxlsxでクライアントにファイルを渡さなければ行けないためです。

最悪、xlsmからxlsxに変更しますので
もし、マクロで可能でしたらこちらもご教示頂ければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

sazi様がおっしゃるように、エクセルの機能や関数だけで、自動でコピーすることは不可能だと思います。
自動となると、VBAでマクロを作る必要がありますが、元のファイルを変更したくない思いと、
複数のユーザーで使用しているエクセルなのかと思いました。
その場合は、エクセルアドインを利用してはと思います。

下の様なコードを作り、アドインで、エクセルを保存して下さい。
保存先を自分で指定するのがポイントです。
保存された、アドインをフーザーに配布して、アドインファイルを開いてもらいます。
イメージ説明
開くと、上の様なメッセージが表示されますが、「マクロを有効にする」を選択すると、
普通のエクセルの様に使用することが出来ます。

動作イメージ
イメージ説明

その後のメンテも、アドインファイルを上書きしてもらうだけなので、便利かと思います。

尚、下のコードは、下にコピーも作ってしまいました。
しかし、このプログラムは、エクセルのオブジェクト構造を理解していないと、
メンテナンスができない難点があります。
sazi様のおっしゃるように、普通のコピー貼り付けが、良いような気がします。

VBA

1Option Explicit 2 3 4Public Sub 右に挿入してコピー() 5 Dim myRange As Range 6 Dim x1 As Long 7 Dim x2 As Long 8 Dim y1 As Long 9 Dim y2 As Long 10 11 Set myRange = Selection 12 13 x1 = myRange.Row 14 y1 = myRange.Column 15 x2 = x1 + myRange.Rows.Count - 1 16 y2 = y1 + myRange.Columns.Count - 1 17 18 If y1 = 1 Then 19 Set myRange = Nothing 20 Exit Sub 21 End If 22 23 Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 24 25 Application.CutCopyMode = False 26 Range(Cells(x1, y1 - 1), Cells(x2, y1 - 1)).Copy 27 Range(Cells(x1, y1), Cells(x2, y2)).Select 28 Range(Selection, Selection.End(xlToRight)).Select 29 Range(Selection, Selection.End(xlToRight)).PasteSpecial 30 31 Range(Cells(x1, y1), Cells(x2, y2)).Select 32 33 Set myRange = Nothing 34 35End Sub 36 37Public Sub 下に挿入してコピー() 38 Dim myRange As Range 39 Dim x1 As Long 40 Dim x2 As Long 41 Dim y1 As Long 42 Dim y2 As Long 43 44 Set myRange = Selection 45 46 x1 = myRange.Row 47 y1 = myRange.Column 48 x2 = x1 + myRange.Rows.Count - 1 49 y2 = y1 + myRange.Columns.Count - 1 50 51 If x1 = 1 Then 52 Set myRange = Nothing 53 Exit Sub 54 End If 55 56 Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 57 58 Application.CutCopyMode = False 59 Range(Cells(x1 - 1, y1), Cells(x1 - 1, y2)).Copy 60 Range(Cells(x1, y1), Cells(x2, y2)).Select 61 Range(Selection, Selection.End(xlDown)).Select 62 Range(Selection, Selection.End(xlDown)).PasteSpecial 63 64 Range(Cells(x1, y1), Cells(x2, y2)).Select 65 66 Set myRange = Nothing 67 68End Sub 69 70 71Public Sub 右メニュー削除() 72 On Error Resume Next 73 Application.CommandBars("Cell").Controls("挿入&コピペ").Delete 74End Sub 75 76 77Public Sub 右メニュー追加() 78 Dim CmdBar As CommandBar 79 Dim CmdCtl As CommandBarControl 80 81 Set CmdBar = Application.CommandBars("Cell") 82 CmdBar.Reset 83 84 Set CmdCtl = CmdBar.Controls.Add(Before:=1, Type:=msoControlPopup) 85 86 With CmdCtl 87 .Caption = "挿入&コピペ" 88 With .Controls.Add 89 .Caption = "右に挿入してコピー" 90 .OnAction = "右に挿入してコピー" 91 End With 92 With .Controls.Add 93 .Caption = "下に挿入してコピー" 94 .OnAction = "下に挿入してコピー" 95 End With 96 End With 97End Sub 98 99 100Public Sub auto_open() 101 102 On Error Resume Next 103 Application.CommandBars("Cell").Controls("挿入&コピペ").Delete 104 105 Err.Clear 106 107 Call 右メニュー追加 108 109End Sub 110

投稿2017/09/24 00:40

kai_keitai

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

①Hをクリックして、列全体をコピー。
②Iをクリックして、コピーしたセルの挿入。
これで、挿入したI列には数式もコピーされます。

但し、挿入前後の式までは変わりませんので、例のような数式には対応できません。
OFFSET()やINDIRECT()で自身のセルからの相対参照の式に変更する必要があります。
多分、こちらの方が本題のような。

投稿2017/09/23 04:15

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問