【问题标题】:Is there a way in R to unmerge spreadsheet cells and fill with values other than duplicates?R中有没有办法取消合并电子表格单元格并填充重复值以外的值?
【发布时间】:2021-10-20 23:30:23
【问题描述】:

我想导入一个 Excel 电子表格,其中包含合并的单元格,取消合并这些单元格并用原始单元格的值除以未合并单元格的数量填充每个未合并的单元格。例如,如果一个包含 4 个单元格的合并单元格包含值 1000,我想取消合并并在每个未合并的单元格中返回 250。

我知道像read.xlsx() 这样的函数,我可以在其中设置fillMergedCells = FALSE;但是,这会将合并后的单元格的原始值的副本填充到每个未合并的单元格中。

这可以在 R 中完成吗,也许使用read.xlsx() 函数?可以在 Excel VBA 中完成吗?我对VBA一无所知,所以任何指针都会有所帮助!

【问题讨论】:

  • 合并单元格中有数据还是空白?如果不为空,您有数据示例吗?
  • @TechCommodities 1 合并单元格中的单元格包含我想要在其他合并单元格上平均分布/分布的值。我已经创建了一组(非常简化的)虚拟数据来说明这里:docs.google.com/spreadsheets/d/…Merged 之前包含,表 Desired result after unmerge 是我想要实现的。
  • 我无法访问该文档。

标签: r excel vba


【解决方案1】:

假设您的xlsx-文件看起来像这样:

Name
100
200
*
*
300

* 是包含200 的合并单元格,因此200 从第 2 行跨越到第 4 行。

使用openxlsx,我们可以将此文件读入数据框:

df1 <- openxlsx::read.xlsx("example.xlsx", fillMergedCells = TRUE)

#>   Name
#> 1  100
#> 2  200
#> 3  200
#> 4  200
#> 5  300

使用另一个包readxl 我们得到

df2 <- readxl::read_xlsx("example.xlsx")

#> # A tibble: 5 x 1
#>    Name
#>   <dbl>
#> 1   100
#> 2   200
#> 3    NA
#> 4    NA
#> 5   300

现在我们结合这两个数据框来计算新的未合并单元格:

library(dplyr)

df1 %>% 
  rename(Name_1 = Name) %>%
  bind_cols(df2) %>%
  group_by(check = cumsum(is.na(Name_1) | !is.na(Name))) %>% 
  mutate(new_col = ifelse(any(is.na(Name)), first(Name)/n(), Name)) %>% 
  ungroup() %>% 
  select(Name = new_col)

返回

# A tibble: 5 x 1
   Name
  <dbl>
1 100  
2  66.7
3  66.7
4  66.7
5 300  

我完全清楚这种方法不是一个非常有效的解决方案,但很难确定合并/未合并的单元格,尤其是在相邻单元格包含相同值的情况下。

【讨论】:

    【解决方案2】:

    您可以使用 VBA 来完成。将此代码放在工作簿中的常规模块中并运行第一个子:

    Sub UnMergeWorkbook()
    
        Dim WS As Worksheet
        For Each WS In ThisWorkbook.Worksheets
        
            Dim Cell As Range
            For Each Cell In WS.UsedRange
            
                If TypeName(Cell.Value2) = "Double" Then
            
                    UnMergeCell Cell
                
                End If
            
            Next Cell
            
        Next WS
        
    End Sub
    
    Sub UnMergeCell(Cell As Range)
    
        Dim RowsCount As Long
        Dim ColsCount As Long
        
        With Cell.MergeArea
            RowsCount = .Rows.Count
            ColsCount = .Columns.Count
        End With
        
        With Cell
            .UnMerge
            .Resize(RowsCount, ColsCount).Value2 = .Value2 / (RowsCount * ColsCount)
        End With
        
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      相关资源
      最近更新 更多