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中更改单元格中的文本_Excel_Vba - Fatal编程技术网

尝试在Excel中更改单元格中的文本

尝试在Excel中更改单元格中的文本,excel,vba,Excel,Vba,我已经十年没有在Excel中使用VBA了,但我想找到一种编码解决方案来更改超过20K个单元格中的一组文本。我的工作让我手动完成,但我知道必须有一个Comp-Sci解决方案 我已经对需要更改的列进行了排序。还有成千上万个重复需要修改,如下面的示例所示 示例:1001.tif如果是第一个副本,则更改为1001_1.tif;如果是该值的第一个文本,则保留该值 我下面的代码根本不起作用,但应该是它的框架 Sub Button1_Click() Dim n As Integer n = 1

我已经十年没有在Excel中使用VBA了,但我想找到一种编码解决方案来更改超过20K个单元格中的一组文本。我的工作让我手动完成,但我知道必须有一个Comp-Sci解决方案

我已经对需要更改的列进行了排序。还有成千上万个重复需要修改,如下面的示例所示

示例:1001.tif如果是第一个副本,则更改为1001_1.tif;如果是该值的第一个文本,则保留该值

我下面的代码根本不起作用,但应该是它的框架

Sub Button1_Click()
  Dim n As Integer
    n = 1
  Dim test As String
    test = Cells(1, D).Text
  Dim active As String
    active = Cells(2, D).Text

  For i = 2 To 12
    active = Cells(i, D)
      If active = test Then
        Cells(i, D).Text = Microsoft.VisualBasic.Strings.Left(test, 4) + "_" + n + ".tif"
        n = n + 1
    Else
        test = active
    End If
Next i

Cells(1, a).Text = "Done"

End Sub
有什么提示吗?

使用COUNTIF()

将此转换为:

进入:


看看我在下面所做的更改。我想这就是你想要实现的

Sub Button1_Click()
    Dim n As Integer
    Dim test As String, active As String

    n = 1

    For i = 2 To 12
        active = Cells(i, D).Value2
        If active = test Then
            Cells(i, "D").Value2 = Left(test, 4) & "_" & n & ".tif"
            n = n + 1
        Else
            test = active
        End If
    Next i

    Cells(1, "A").Value2 = "Done"
End Sub

基于对您打算做什么的假设,我对您的代码做了一些更改。希望这会有所帮助

Sub Button1_Click()
  Dim n As Integer
  Dim test As String
  Dim active As String

  n = 1

  For i = 2 To 12
      active = Cells(i, 4)
      test = Cells(i - 1, 4)
      If active = test Then
          Cells(i, 4).Value = VBA.Left(test, 4) & "_" & n & ".tif"
          n = n + 1
      Else
          test = active
          n = 1
      End If
  Next i

  Cells(1, 1).Value = "Done"

End Sub

此代码将按照您描述的方式执行。只需对所有相同的文件进行排序并运行宏即可。我添加了rg来计算过去是动态的行,但您可以根据需要进行更改

  Sub test()
  Dim n As Integer
  Dim rg As Integer
  rg = ActiveSheet.UsedRange.Rows.Count
    n = 1
  Dim test As String
    test = Cells(1, 4).Text
  Dim active As String

  For i = 2 To rg
    active = Cells(i, 4)
      If active = test Then
        Cells(i, 4).Value = Left(test, 4) & "_" & n & ".tif"
        n = n + 1
    End If
Next i

MsgBox "Done"
End Sub

如果您对vba有些反感,下面是一个单元格内公式的实现,其方法与当前vba答案相同。假设D是文件名列:

=IF(COUNTIF($D$2:D2,D2)>1,MID(D2,1,FIND(“,”,D2)-1)和“&”COUNTIF($D$2:D2,D2)和“.tif”,D2)也会这样做

一些解释: COUNTIF()公式计算从列顶部($D$2)到当前行的字符串出现次数。
MID/FIND公式将出现次数和下划线放在。在文件名中。FIND获取字符串的位置。MID将字符串切掉在点之前,然后公式的其余部分追加数字和文件扩展名。这将适用于长度超过4个字符的数字

使用
.Value2
而不是
.Text
谢谢,但是,我尝试过,它仍然给我相同的运行时错误“1004”应用程序定义的错误或对象定义的错误看看下面的答案。您需要做更多的更改,而这正是我想要做的,但是我得到了一个运行时错误“5”:无效的过程调用或参数。当我单击“调试”时,它会突出显示j=application的行。您使用的是Excel还是Visual Studio?我使用的是Excel 2016,此时它应该可以工作。不知道为什么它对你不起作用。你有没有改变我的代码?没有,我没有,但是我的测试数据的长度不同,但是我改变了它以匹配4位数字和ext-它工作了,但仍然有错误。我是否必须更改代码以处理更长的文件名?此代码的问题在于循环开始时,将测试重置为等于上面活动行的测试,因此它将输出1001.tif 1001_1.tif 1001.tif。谢谢你。重置n是else语句,这肯定是我忽略的。
  Sub test()
  Dim n As Integer
  Dim rg As Integer
  rg = ActiveSheet.UsedRange.Rows.Count
    n = 1
  Dim test As String
    test = Cells(1, 4).Text
  Dim active As String

  For i = 2 To rg
    active = Cells(i, 4)
      If active = test Then
        Cells(i, 4).Value = Left(test, 4) & "_" & n & ".tif"
        n = n + 1
    End If
Next i

MsgBox "Done"
End Sub