2014-11-05 169 views
0

我想在Excel中保存单元格的值。保存单元格的值

多数民众赞成使用的代码IM:

Dim oldval As Range 
Sub Macro0() 

Set oldval = ActiveCell 

End Sub 

Sub Macro2() 

Dim y As Integer 
Dim x As Variant 

Dim rng2 As Range 
Set rng2 = ActiveCell 

Dim rng As Range 
Set rng = ActiveCell 

If rng.Column = 8 And rng.Value <> "" Then 
    'Extract the number part of string 
    x = Split(rng2.Value, "_")(0) 
    y = Split(rng.Value, "_")(0) 

    If y < 1 Or x = "" Then Exit Sub 

    If x < y Then 
     MsgBox "Attenzione, si sta decrementando di stato un fornitore !" 
    Else 
     MsgBox "Stato cambiato con successo" 

End If 
End If 


End Sub 

我需要保存,这是在细胞就得到改变之前的值。 我试图用代码:

Private Sub Worksheet_Change(ByVal Target As Range) 
Call Macro1 
End Sub 




Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
Call Macro0 
End Sub 

但使用不位于工作簿宏犯规因为即时通讯工作。 我需要做一个控制后,我已经保存旧的值,并检查它是否高于已插入的新值。 如何保存旧值? 感谢

编辑: @Jeeped 这就是它的外观文件 File

+0

通过“Worksheet_Change”事件宏,有时可以在*它被更改后保存单元格*的值。您将不得不提供一些特定的单元格地址(在您的示例代码中,* rng *和* rng2 *指向相同的'ActiveCell'),最好查看要保存的内容样本。 – Jeeped 2014-11-05 17:50:49

+0

可靠地做到这一点的唯一方法是将工作表中的值存储在另一个隐藏的('VeryHidden')工作表中。然后,您可以将新值(使用“更改”事件)与另一张纸上的值进行比较,然后在比较后更新隐藏纸张。 – 2014-11-05 18:05:48

+0

为了在单元格被更改后获得单元格的值,您需要使用Application.Undo然后记录该值,然后您可以再次使用Application.Undo将更改后的值放回 – tigeravatar 2014-11-05 18:41:55

回答

1

我想我刚才完全理解你的需要。这里是一个变通:这样

Sub macro1(ByVal oldVal As String, ByVal newVal As String) 
    MsgBox "The value was " & oldVal & ", but now is " & newVal 
End Sub 

在工作表模块

在你的模块,添加宏1(),添加以下两个事件+声明

Dim oldVal As String, newVal As String 'the top declaration allows you to use the variables even when the macro/method of the worksheet has finished to run 
Private Sub Worksheet_Change(ByVal Target As Range) 
    newVal = Target.Value 'this will just take the current value of the cell 
    Call macro1(oldVal,newVal) 'they are both passed to your procedure 
End Sub 
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    oldVal = Target.Value 'this will record the value of the cell everytime you are selecting it 
End Sub 

下面是它的工作原理,将单元格的内容从“buongiorno”更改为“buonasera”:

enter image description here

enter image description here

当然,这是一个例子,但你只需要重新适应您的代码的解决办法,它应该工作的罚款。 注:我刚刚发现消息框显示的信息与编码的语言不同,这是因为我在测试方法时做了屏幕截图。对不起,如果您认为这可能会造成混淆,请提出修改建议。

+0

好吧,但它不工作在这里:'Dim rng2 As Range Set rng2 = oldVal'因为我需要对改变后的值 – Kiirito 2014-11-05 19:49:47

+0

@Kiirito做一个控制,我仍然没有理解你为什么继续引用对象而不是它的价值。 '设置rng2 = oldVal'意味着你携带着整个范围,而不仅仅是它的价值......所以如果价值调用会让你回到当前价值是正常的,因为你带着范围对象和不是它的价值!请尝试按照我在代码中显示的那样使用示例,其中我定义了'As String'(或其他任何值数据类型),或者更改了问题标题,因为您要求范围的值:) – 2014-11-05 19:52:55

+0

I我会尽力去适应它。谢了哥们 !如果我不能适应它,我会打开一个新的线程与问题。 – Kiirito 2014-11-05 19:53:19

1

您需要在项目级别声明变量。这里有一个简单的例子:

Dim a As String 
Sub macro1() 
    a = Range("A1") 
End Sub 
Sub macro2() 
    MsgBox a 
End Sub 

如果您运行的宏1,变量a(这是在顶层声明)将存储单元格的范围(“A1”)的值。然后,如果您在第二时间运行macro2,该值将仍然存在。

您只需要在项目顶部声明变量oldval,并在您做出更改之前将您的旧值存储为oldValue = ActiveCell.Value。该变量将保持该值,即使在退出宏之后,也可以使用该值在以后进行比较。

+0

我无法在同一个Workbook_change事件中使用这2个宏。它不会工作,我在哪里把第一个宏?否则第二个? – Kiirito 2014-11-05 18:01:58

+0

如果您使用'SelectionChange'事件来存储该值,则可能会忽略此操作,但如果用户两次更改同一个单元格而不移动到另一个单元格中,则此操作不起作用。 – 2014-11-05 18:03:25

+0

它似乎我不能继续与此。它只是没有保存它的宏之后的价值。检查我的编辑,看看代码即时通讯使用 – Kiirito 2014-11-05 18:10:11

相关问题