web-dev-qa-db-ja.com

コピー/貼り付け後にExcelの自動セル参照変更を無効にする方法

作業中のExcel 2003スプレッドシートが大量にあります。多数のセル参照を含む非常に大きな数式が多数あります。以下に簡単な例を示します。

='Sheet'!AC69+'Sheet'!AC52+'Sheet'!AC53)*$D$3+'Sheet'!AC49

それらのほとんどはそれよりも複雑ですが、これは私が取り組んでいるものの良いアイデアを提供します。これらのセル参照のほとんどは絶対($ s)です。セル参照を変更せずに、これらのセルを別の場所にコピーできるようにしたいと思います。参照を絶対にするために単にf4を使用できることは知っていますが、多くのデータがあり、後でFillを使用する必要があるかもしれません。参照を絶対にせずに、コピー/貼り付け/塗りつぶしでセル参照の変更を一時的に無効にする方法はありますか?

編集:セルの内容を数式ではなくテキストとしてコピーすることで、VBAでこれを実行できることがわかりました。ただし、行/列全体を一度にコピーするため、これを行う必要はありません。私が見逃している簡単な解決策はありますか?

42
Bat Masterson

から http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas_take_2

  1. Excelを数式表示モードにします。これを行う最も簡単な方法は、 Ctrl+` (その文字は「後方アポストロフィ」であり、通常〜(チルダ)を持つ同じキー上にあります。
  2. コピーする範囲を選択します。
  3. 押す Ctrl+C
  4. Windowsメモ帳を起動します
  5. 押す Ctrl+V コピーしたデータをメモ帳に貼り付ける
  6. メモ帳で押します Ctrl+A に続く Ctrl+C テキストをコピーする
  7. Excelをアクティブにし、数式を貼り付ける左上のセルをアクティブにします。そして、コピー先のシートが数式表示モードになっていることを確認してください。
  8. 押す Ctrl+V 貼り付けます。
  9. 押す Ctrl+` 数式表示モードを切り替えるには。

注:Excelへの貼り付け操作が正しく機能しない場合は、Excelのテキストから列への機能を最近使用した可能性があります。Excelは、最後にデータを解析した方法を覚えておくと役立ちます。テキストを列に変換ウィザードを起動する必要があります。 [区切り]オプションを選択し、[次へ]をクリックします。タブを除くすべてのデリミタオプションのチェックマークをクリアします。

または、 http://spreadsheetpage.com/index.php/tip/making_an_exact_copy_of_a_range_of_formulas/ から:

If you're a VBA programmer, you can simply execute the following code: 
With Sheets("Sheet1")
 .Range("A11:D20").Formula = .Range("A1:D10").Formula
End With
54
Whit Kemmey

非常に簡単な解決策は、コピーする範囲を選択してから、検索と置換(Ctrl + h)を行い、=を式で使用されていない別のシンボル(たとえば[#) -したがって、それがアクティブなフォーミュラであることを止めます。

次に、選択した範囲をコピーして新しい場所に貼り付けます。

最後に、元の範囲と新しい範囲の両方で#=に戻すために検索と置換を行い、両方の範囲を数式に戻します。

22

セル参照を変更せずにコピーする簡単な方法を探してこのサイトに来ました。しかし今、私は自分の回避策がこれらの方法のほとんどより簡単だと思いました。私の方法は、コピーが参照を変更するが、移動は変更しないという事実に依存しています。以下に簡単な例を示します。

列AとBに生データがあり、Cに式(C = A + Bなど)があり、列Fに同じ式が必要であるが、CからFにコピーするとF = D + Eになると仮定します。

  1. Cの内容を空の一時列(Rなど)にコピーします。相対参照はR = P + Qに変更されますが、エラーとしてフラグが付けられていても無視します。
  2. Cに戻り、Fに移動(コピーではなく)します。式は変更されないため、F = A + Bになります。
  3. ここで、Rに移動してCにコピーします。相対参照はC = A + Bに戻ります
  4. Rの一時式を削除します。
  5. ボブはあなたのおじです。

さまざまなセルでこれを行ったので、事実上あらゆるレベルの複雑さで動作すると思います。コピーしたセルを駐車するには、空のエリアが必要です。そしてもちろん、どこに置いたのかを覚えておかなければなりません。

6
JimH

この簡単なトリックは機能します:コピーと貼り付け。カットアンドペーストしないでください。貼り付けた後、コピーした部分を選択し直して編集に進み、CLEARにスライドしてコンテンツをクリアします。

1
Bob R

編集で言及した回避策に固執していると思います。

まず、シート上のすべての数式を次のようなテキストに変換します。

Dim r As Range

For Each r In Worksheets("Sheet1").UsedRange
    If (Left$(r.Formula, 1) = "=") Then
        r.Formula = "'ZZZ" & r.Formula
    End If
Next r

ここで、'ZZZ'を使用してテキスト値を表し、ZZZはテキストを数式に戻すときに検索できる値として使用します。明らかに、いずれかのセルが実際にテキストZZZで始まる場合は、VBAマクロのZZZ値を別のものに変更します

再配置が完了したら、テキストを次のような式に変換します。

For Each r In Worksheets("Sheet1").UsedRange
    If (Left$(r.Formula, 3) = "ZZZ") Then
        r.Formula = Mid$(r.Formula, 4)
    End If
Next r

この方法の1つの本当の欠点は、再配置中に数式の結果が表示されないことです。テキストから式に戻すときに、たとえば#REFエラーが大量に発生することがあります。

段階的にこれに取り組み、頻繁に式に変換して大災害が発生していないことを確認することが有益な場合があります

0
barrowc

@Alistair Collinsソリューションを自動化するこのソリューションを見つけました。

基本的には、任意の式の=を*に変更し、その後貼り付けを行ってから元に戻します

        Dim cell As Range

msgResult = MsgBox("Yes to lock" & vbNewLine & "No unlock ", vbYesNoCancel + vbQuestion, "Forumula locker")

If msgResult = vbNo Then
    For Each cell In Range("A1:i155")
        If InStr(1, cell.Value, "*") > 0 Then
            cell.Formula = Replace(cell.Formula, "*", "=")
        End If
    Next cell
ElseIf msgResult = vbYes Then
    For Each cell In Range("A1:i155")
        If cell.HasFormula = True Then
            cell.Formula = Replace(cell.Formula, "=", "*")
        End If
    Next cell
End If
0
eyadt4

操作の実行中に、find/replaceを使用して式を無効にするのが一般的です。たとえば、転置してコピーします。数式は、プレースホルダー(たとえば、「$ =」)を前に置くことにより無効になります。操作が完了すると、検索置換はこれらを取り除くことができます。

このvbaは、アクティブシートの検索/置換を自動化するだけです。

' toggle forumlas on active sheet as active/ inactive
' by use of "$=" prefix

Sub toggle_active_formulas()
    Dim current_calc_method As String
    initial_calc_method = Application.Calculation
    Application.Calculation = xlCalculationManual
    Dim predominant As Integer
    Dim c As Range
    For Each c In ActiveSheet.UsedRange.Cells
        If c.HasFormula Then
            predominant = predominant + 1
        ElseIf "$=" = Left(c.Value, 2) Then
            predominant = predominant - 1
        End If
    Next c
    If predominant > 0 Then
        For Each c In ActiveSheet.UsedRange.Cells
            On Error Resume Next
            If c.HasFormula Then
                c.Value = "$" & c.Formula
            End If
        Next c
    Else
        For Each c In ActiveSheet.UsedRange.Cells
            On Error Resume Next
            If "$=" = Left(c.Value, 2) Then
                c.Formula = Right(c.Value, Len(c.Value) - 1)
            End If
        Next c
    End If
    Application.Calculation = initial_calc_method
End Sub
0
Chris

このマクロはすべての仕事をします。

Sub Absolute_Reference_Copy_Paste()
'By changing "=" in formulas to "#" the content is no longer seen as a formula.
' C+S+e (my keyboard shortcut)

Dim Dummy As Range
Dim FirstSelection As Range
Dim SecondSelection As Range
Dim SheetFirst As Worksheet
Dim SheetSecond As Worksheet

On Error GoTo Whoa

Application.EnableEvents = False

' Set starting selection variable.
Set FirstSelection = Selection
Set SheetFirst = FirstSelection.Worksheet

' Reset the Find function so the scope of the search area is the current worksheet.
Set Dummy = Worksheets(1).Range("A1:A1").Find("Dummy", LookIn:=xlValues)

' Change "=" to "#" in selection.
Selection.Replace What:="=", Replacement:="#", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Select the area you want to paste the formulas; must be same size as original
  selection and outside of the original selection.
Set SecondSelection = Application.InputBox("Select a range", "Obtain Range Object", Type:=8)
Set SheetSecond = SecondSelection.Worksheet

' Copy the original selection and paste it into the newly selected area. The active
  selection remains FirstSelection.
FirstSelection.Copy SecondSelection

' Restore "=" in FirstSelection.
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Select SecondSelection.
SheetSecond.Activate
SecondSelection.Select

' Restore "=" in SecondSelection.
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

' Return active selection to the original area: FirstSelection.
SheetFirst.Activate
FirstSelection.Select

Application.EnableEvents = True

Exit Sub

Whoa:
' If something goes wrong after "=" has been changed in FirstSelection, restore "=".
FirstSelection.Select
Selection.Replace What:="#", Replacement:="=", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False

End Sub

新しい選択を行うときは、元の選択のサイズと形状を一致させる必要があることに注意してください。

0
Bill Martz