Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在我的工作簿的其余部分中,如何在2种货币美元和AED@汇率3.68之间进行转换,但只能在每张工作表上选定的单元格范围内进行转换?_Excel_Vba_Excel Formula_Currency - Fatal编程技术网

Excel 在我的工作簿的其余部分中,如何在2种货币美元和AED@汇率3.68之间进行转换,但只能在每张工作表上选定的单元格范围内进行转换?

Excel 在我的工作簿的其余部分中,如何在2种货币美元和AED@汇率3.68之间进行转换,但只能在每张工作表上选定的单元格范围内进行转换?,excel,vba,excel-formula,currency,Excel,Vba,Excel Formula,Currency,比如说。我希望我的介绍表“主表”有一个选项,可以在不同货币之间切换工作簿。美元和AED的汇率为3.68。某些单元格引用了不同工作表中的其他单元格,因此我不想更改单元格引用,我只需要计算每个工作表中特定单元格的速率 如何更好地使用复选框或按钮来实现这一点,以便从一开始就轻松转换。我正在使用excel for Mac。谢谢创建一个带有验证下拉列表的单元格,允许在AED和USD之间进行选择。将该单元格转换为命名区域,以便在整个工作簿中轻松引用。你可以称之为“Curr”,是“Currency”的缩写(缩

比如说。我希望我的介绍表“主表”有一个选项,可以在不同货币之间切换工作簿。美元和AED的汇率为3.68。某些单元格引用了不同工作表中的其他单元格,因此我不想更改单元格引用,我只需要计算每个工作表中特定单元格的速率


如何更好地使用复选框或按钮来实现这一点,以便从一开始就轻松转换。我正在使用excel for Mac。谢谢

创建一个带有验证下拉列表的单元格,允许在AED和USD之间进行选择。将该单元格转换为命名区域,以便在整个工作簿中轻松引用。你可以称之为“Curr”,是“Currency”的缩写(缩写是因为它经常被使用)

我建议您在某个地方创建一个类似的单元格,输入当前为3.68的速率,但计划仅在该单元格中更改速率,并将其应用于所有工作簿。将该单元格命名为“Rate”

现在,所有包含您可能希望切换的值的单元格将遵循以下公式<代码>=[CellValue]*如果(Curr=“AED”,费率,1)。该公式假定所有值均以美元输入。如果在AED中输入,则公式应如下所示<代码>=四舍五入([CellValue]/IF(Curr=“AED”,1,费率),2)

如您所见,此解决方案需要在某个位置记录原始单元格值,这意味着用于数据捕获的单元格不能与用于数据显示的单元格相同。如果您希望坚持捕获和显示在同一单元格中,则需要代码来进行转换

从表面上看,这似乎很简单:当
Curr
选择更改时,所有受影响值的单元格都会重新计算。在实践中,这将导致灾难,因为有1001种方式可能出现错误,然后您将丢失所有数据,而此时您不知道这些值是美元还是AED


因此,需要将数据捕获和数据显示分开。完成后,工作表函数可能不仅是实现所需功能的最简单也是最有效的方法。

我假设您希望在输入单元格上进行转换,并且并非所有单元格都是公式,而且许多要转换的单元格都是值。你应该认真考虑拆分输入与显示的答案,它将更为万无一失,并能避免任何可能破坏你的工作簿的逻辑。

如果你对这条路很感兴趣,那么做以下几点,但是,在你做之前备份工作簿。我对以下代码所做的任何测试都没有中断,但我没有您的工作簿,因此,我不作任何保证

首先,您需要一个单元格来提供当前汇率。您需要为该单元格指定一个范围ExchangeRate

在我的工作簿中,该单元格包含一个公式

=IF(B1="USD",1,3.68)
看起来像这样

。。。单元格B1附带了一个验证,允许您从两种货币中选择,AEDUSD

您说过希望能够确保只转换选定的单元格。为了确保我们只圈出这些单元格,您需要在每张图纸上创建一个包含所有这些单元格的命名范围

该范围的名称需要调用CellsToConvert,您可以通过名称管理器来实现创建命名区域时,请确保指定要为其创建的工作表,不要选择“工作簿”选项。

。。。下面显示了我在第一张纸上使用的零星范围。所有彩色单元格都是该范围的一部分。绿色单元格包含值,黄色单元格包含公式

在一天结束时,这个范围可能很大,并且跨越不同的床单,但它应该可以工作

现在,将以下代码添加到VBA编辑器中的ThisWorkbook对象中

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim objCell As Range, dblExRate As Double, strFormula As String, objSheet As Worksheet
    Dim strNewFormula As String, strOpeningChar As String, bIsFormula As Boolean
    Dim objCells As Range, strError As String, strExRateRangeName As String

    strExRateRangeName = "ExchangeRate"

    dblExRate = Range(strExRateRangeName)

    Application.EnableEvents = False

    For Each objSheet In Worksheets
        On Error Resume Next

        strError = ""

        Err.Clear

        Set objCells = objSheet.Range("CellsToConvert")

        strError = Err.Description

        On Error GoTo 0

        If strError = "" Then
            For Each objCell In objCells
                strFormula = objCell.FormulaR1C1
                bIsFormula = False

                ' Check to make sure this field contains a formula.
                If Left(strFormula, 1) = "=" And objCell.NumberFormat <> "@" Then
                    bIsFormula = True
                End If

                If dblExRate = 1 Then
                    ' Base currency selected.
                    ' Check to see if the cell contains a formula, if it does,
                    ' convert it back to a value
                    If bIsFormula Then
                        ' It's a formula and the cell is not set to text, proces it back
                        ' to its original value, that could still be a formula.

                        ' Remove all of the exchange rate components we would've added as
                        ' a part of this routine.
                        strNewFormula = Replace(strFormula, ") * " & strExRateRangeName, "")

                        ' Check to see if the formula has changed against the previous statement,
                        ' if it has, then it contained the custom additions, otherwise, it didn't.
                        If strFormula <> strNewFormula Then
                            strNewFormula = Mid(strNewFormula, 3)

                            ' Check to see if the new value is numeric, if it is, remove the leading
                            ' equals sign as it wasn't originally a formula, or, at least it doesn't
                            ' need to be a formula.
                            If IsNumeric(strNewFormula) Then
                                objCell.Value = strNewFormula
                            Else
                                objCell.FormulaR1C1 = "=" & strNewFormula
                            End If
                        End If
                    End If
                Else
                    ' Something other than the base currency has been selected.
                    strNewFormula = objCell.FormulaR1C1

                    If InStr(1, strNewFormula, strExRateRangeName, vbTextCompare) = 0 Then
                        If bIsFormula Then strNewFormula = Mid(objCell.FormulaR1C1, 2)

                        objCell.FormulaR1C1 = "=(" & strNewFormula & ") * " & strExRateRangeName
                    End If
                End If
            Next
        End If
    Next

    Application.EnableEvents = True
End Sub
Private子工作簿\u SheetChange(ByVal Sh作为对象,ByVal Target作为范围)
Dim objCell作为范围,dblExRate作为双精度,strFormula作为字符串,objSheet作为工作表
Dim strNewFormula作为字符串,strOpeningChar作为字符串,bIsFormula作为布尔值
Dim objCells作为范围,strError作为字符串,strExRateRangeName作为字符串
strExRateRangeName=“ExchangeRate”
dblExRate=范围(strExRateRangeName)
Application.EnableEvents=False
对于工作表中的每个OBJ表
出错时继续下一步
strError=“”
呃,明白了
设置objCells=objSheet.Range(“CellsToConvert”)
strError=错误描述
错误转到0
如果strError=“”,则
对于objCell中的每个objCell
strFormula=objCell.FormulaR1C1
公式=False
'检查以确保此字段包含公式。
如果左(strFormula,1)=“=”和objCell.NumberFormat“@”,则
公式=真
如果结束
如果dblExRate=1,则
'已选择基础货币。
'检查单元格是否包含公式,如果包含公式,
'将其转换回值
如果是,那么
'这是一个公式,单元格未设置为文本,请将其处理回
按照它的原始价值,这仍然可能是一个公式。
他说,删除我们本应添加的所有汇率组成部分
“这是例行公事的一部分。
strNewFormula=Replace(strFormula,“)*”&strExRateRangeName,”)
'检查公式是否与前一个stateme发生了更改