如何有条件地从一行复制选定的单元格并格式化粘贴?

时间:2015-03-15 18:48:41

标签: excel

我正在尝试创建一个使用来自用户操作的多个产品表中的数据的商品生成器。我对用户友好性的追求给我带来了一些问题,但是我求助于你。

为了更容易理解我想要实现的目标,我附上了一张图片,展示了我必须使用的内容。我将有多个表,如图中所示的两个表,所有显示的数据都是虚构的。这些表格也有不同数量的价格组。

enter image description here

我想要做的是有一个带有附加宏的按钮,可以查看M(已售出)列。如果它找到一个大于0的数字,它会复制销售量并将其放入B列,创建一个字符串并将其放在包含与表关联的产品名称和描述的C列中,最后绑定时间。如果绑定时间为空"没有绑定"应该退还。最后,应将J(月费)栏复制到E栏。

对于Sold值大于0的所有行,宏/函数应该继续添加这样的条目。从边框完成它,并在最后进行求和。

我现在的智慧结束了,这是可行的还是我把自己画成了一个角落?

编辑1:

感谢@rgo的帮助,我正在努力实现这项工作!我放置了我的单元格,为了理解下面的代码,我提出了一些问题,生成的表格跨越第3行的B:E,标题为“Amount'”,“'描述&#39 ;,'月费','总计' (金额*月费)。

表数据在G:N上看起来相同,M由+ - 按钮填充以增加/减少N中的值.O和P列包含带有产品名称和附加说明的隐藏文本字符串。

编辑2: 我终于得到了宏来做我想做的事!可能还有改进的余地,我很乐意听取建议,但以下代码可以完成这项工作:

    Dim sWS As Worksheet
Dim aCell As Range
Dim lRow As Long
lRow = 3
Set sWS = ThisWorkbook.Sheets("Sheetname")

Range("B3:E40").clear 'clear the cell range before re-running the macro'

For Each aCell In sWS.Range("N3:N100")
    'check if the encountered value in the N column is a number greater than 0. If it is fill B:E columns with the desired data'
    If IsNumeric(aCell.Value) = True And aCell.Value > 0 Then
        sWS.Range("B" & lRow) = sWS.Range("N" & aCell.Row)
        sWS.Range("D" & lRow) = sWS.Range("I" & aCell.Row)
        sWS.Range("E" & lRow) = "=B" & lRow & "*D" & lRow
        sWS.Range("C" & lRow) = sWS.Range("P" & aCell.Row) & " " & sWS.Range("Q" & aCell.Row) & " " & sWS.Range("M" & aCell.Row)


        lRow = lRow + 1
    End If
Next aCell

lRow = lRow + 1

'draw border and add formula to sum the E column'

Range("B" & lRow, "E" & lRow).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
Selection.Borders(xlEdgeLeft).LineStyle = xlNone
With Selection.Borders(xlEdgeTop)
    .LineStyle = xlContinuous
    .ColorIndex = 0
    .TintAndShade = 0
    .Weight = xlThick
End With
Selection.Borders(xlEdgeBottom).LineStyle = xlNone
Selection.Borders(xlEdgeRight).LineStyle = xlNone
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

sWS.Range("C" & lRow) = "Total monthly costs"
sWS.Range("E" & lRow).Formula = "=Sum(E2:E" & lRow - 1 & ")"

1 个答案:

答案 0 :(得分:0)

非常简单,但你需要学习如何编写宏。

尝试这样的事情。

Dim sWS as worksheet
dim aCell as range
dim lRow as long
lrow = 2
set sWS = thisworkbook.sheets("SHEETNAMEGOESHERE")

for each acell in sws.range("M2:M20")
  if acell.value > 0 then
    sws.range("H" & acell.row).copy sws.range("C" & lrow)
    'copy additional cells using above
    lrow = lrow + 1
  endif
next acell

要粘贴下划线和小计,请在打开宏录制器时第一次手动添加它们。然后复制代码,并在复制循环完成后将地址更改为下一个可用行。