0

我有一个包含 4 张纸的 Microsoft Excel 文档。每张纸有 21 行和大约 500 列。我正在尝试编写一个最近邻函数来填充这些工作表中具有特定值的所有单元格。

行数据布局示例:

  1. 25 41 54 54 XX 41 54 XX XX XX 54 14
  2. 23 88 33 XX 41 54 XX 87 48 65 77 14

我需要检查所有数据并将 XX 替换为最近的行邻居。我认为这可以for通过遍历每个值(每行中的每一列)并查看当前单元格是否为 XX 的嵌套循环来完成。如果是这样,它应该抓取没有 XX 值的最近邻居。

4

2 回答 2

0

我会对此进行尝试...但请记住,由于您没有回应澄清请求,因此这可能与您的想法不完全一致。此外,我在没有访问运行 VBA 的机器的情况下执行此操作,因此可能存在一两个微不足道的错误。

Option Explicit
sub fillNN()
' we know there are five rows; number of columns is "approximate".
dim thisRow as Integer
dim s, c
dim r, rLast as range

for each s in WorkBook.WorkSheets
  s.Activate
  set r = Range("A1")

  For thisRow = 1 To 5
    set r = Range("A1").Offset(thisRow-1,0)
    set rLast = r.End(xlToRight) ' find the last cell in the row

    for each c in Range(r, rLast).cells
      if c.Value = "XX" Then
        c.Value = nearestNeighbor(c)
      end if
    next c
  Next thisRow

  ' the nearestNeighbor() function left the "XX" on the value
  ' now we have to strip it:
  For thisRow = 1 To 5
    set r = Range("A1").Offset(thisRow-1,0)
    set rLast = r.End(xlToRight) ' find the last cell in the row

    for each c in Range(r, rLast).cells
      if Left(c.Value, 2) = "XX" Then
        c.Value = MID(c.Value, 3, len(c.Value)-2)
      end if
    next c
  Next thisRow

Next s
End Sub

Function nearestNeighbor(c as Range)
' find the nearest "valid" cell:
' look to the left and to the right; if nothing found, extend the range by 1 and repeat
Dim rc, cc , dr, cs, s as Integer
Dim lastCol as Integer
Dim flag as Boolean
flag = true
s = 1 ' size of step

lastCol = c.End(xlToRight).column

' if c is the last cell, then the above will go to the end of the spreadsheet
' since we know there are "about 500" columns, we can catch that easily:
if lastCol > 1000 Then lastCol = c.column

' make sure there is always a return value:
nearestNeighbor = "XX"
While (flag)
  For dr = -1 To 1 Step 2
    cs = c.column + dr * s
    If Not(cs < 1 Or cs > lastCol) Then
      If Not c.offset(dr * s, 0).Value = "XX" Then
        flag = false
        ' keep the "XX" in front so it won't become a "valid nearest neighbor" on next pass
        nearestNeighbor = "XX" + c.offset(dr * s, 0).Value
        Exit For
      End If
    End If
  Next dr
  s = s + 1
  if s > lastCol Then flag = false
End While

End Function
于 2013-03-15T03:22:18.060 回答
0

试试下面的代码:

假设您的数据如下图所示。

在此处输入图像描述

代码 :

Sub Sample()
    Dim rng As Range
    Set rng = Cells.Find("XX")

    Do Until rng Is Nothing
        rng.Value = rng.Offset(0, -1) 'Offset(0, -1) for left neighbour  , Offset(0, 1) for right
        Set rng = Cells.Find("XX")
    Loop
End Sub
于 2013-03-15T04:58:23.470 回答