Excel中,如何用VBA来执行以下功能,高手请进,若能完美运行,我将增加100分悬赏

情况说明: 我原来的表格行数很多,但下一行和上一行相同的地方也比较多,完全不同的只有 J列《长度》和 k列《数量重量》,只有这两列的数据每行都要填,(大多数的数据基本上都是自动生)。原来用函数公式执行以下功能,但因为行数太多,表格反应非常慢,所以想换成VBA来解决)我的数据从第三行开始,6万行结束。

总目标:我想在k列《数量重量》 输入数据时 A列/ B列/ C列 /D列/ E列/ F列/ G列/ H列/ I列 分别达到以下功能:

1) A列《ID号》(从A3开始),K列每输入一个数据,A列能自动输入一个ID号 (从1开始,6万结束)
2) C列《客户》(从C3开始),K列每输入一个数据,《客户列》默认等于上一个单元格【如 C4=C3/c5=c4/c8=c7等】 ,在C列除了默认等于上一个单元格外,还要允许手工填写《新的客户》【 如C3 /C6/C7等 】

3) E/F/G/H/I这五列的要求一样,在k列输入数据,如果 C列(客户名称一致) ,他们默认等于上一个单元格【例如:当在K4输入数据时,如果C4=C3时,则E4=E3/F4=F3/G4=G3/H4=H3/I4=I3.】但也可以不同,允许手工输入【如C21=C20但E21不等于E20】(这五列功能一致,但要单独运算)

4)B列《订单编码》,当在k列输入数据,是根据C列《客户》的变化生成新的编码【如C6不等于C5,则B5生成了新的编码,如C7不等于C6,则B7生成了新的编码,C5=C4=C3所以B5=B4=B3】

5)D列《订单日期》当在k列输入数据,是根据C列《客户》的变化生成新的时间【如C6不等于C5,则D5生成了新的系统时间,如C7不等于C6,则D7生成了新的时间】如果客户名称不变,时间等于上一单元格【如C5=C4=C3所以D5=D4=D3】,时间一旦输入,就不变,除非手工改动
以上是我的要求,如果一个代码能全部解决最好,如果只能解决部分功能,也请解答,人多力量大吗!我都会加分的
二 这一行的(C列)的单元格不等于上一行的单元格时, ⑴ 如果这一行(E列 / F列 / G列 /H列/ J 列 / I列) 单元格内是空格,保持空格。⑵ 如果这一行(E列 / F列 / G列 /H列/ J 列 / I列) 单元格内 有数据,保留数据

以下代码必须放到Excel对象下的对应工作表中。就是VBA编辑器左上角工程框那里可以选到的,双击对应工作表。
我是根据你的操作顺序来做的,应该是先输重量,有必要再改客户名吧。
首先是K列值变动就会拷贝上一行数据,当然ID号是递增的。K列一次粘贴多个数据也OK
之后客户名改变即改变C列改变时,这时会自动增加订单号。订单号格式可以任意,我用的是自动增加序列号,其他地方请手动更改。

Private Sub worksheet_change(ByVal Target As Range)

If Target.Column = 11 Then '如果K列的值有变动
Call ValueChangeK(Target)
ElseIf Target.Column = 3 Then '如果C列的值有变动
Call ValueChangeC(Target)
End If

End Sub

Sub ValueChangeK(ByVal Target As Range)

Dim i As Long
Dim j As Integer
Dim rng As Range

For Each rng In Target
i = rng.Row
Cells(i, 1) = i - 2
For j = 2 To 9
Cells(i, j) = Cells(i - 1, j)
Next j
Next rng

End Sub

Sub ValueChangeC(ByVal Target As Range)

Dim i As Long
Dim j As Integer

i = Target.Row
If Cells(i, 4) <> "" Then
Cells(i - 1, 2).AutoFill Destination:=Range(Cells(i - 1, 2), Cells(i, 2)), Type:=xlFillDefault
End If

End Sub追问

不好意思,我明天测试

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-22

根据你的描述 做了一个示例 看看能否符合 你的需求吧!

程序主要是 针对 数量重量 列 以及 客户 列 数据的变化来自动实现你描述需要的变化 客户可以再次修改……你可以 数一下数据 试验一下哦


这里 第三行应该是 预先输入一个数据 从第四行开始 才有你说的那个样子哦……

如果 还有什么问题的话 你再追问吧!

祝你快乐!

追问

该代码在实际应用中,如果在(K列)的某一行输入数据时,如果这一行的(C列)的单元格等于上一行的单元格,则(E列 / F列 / G列 /H列/ J 列 / I列 )默认等于上面一个单元格。在该代码中已经完全实现。但他有一个问题,就是如果这些单元格内有数据,原来的数据就被清除了。

如果在(K列)的某一行输入数据时


这一行的(C列)的单元格等于上一行的单元格:
⑴ 如果这一行(E列 / F列 / G列 /H列/ J 列 / I列 )单元格内是 空格 ,则默认等于上一行的单元格。⑵如果这一行(E列 / F列 / G列 /H列/ J 列 / I列 )原来的单元格内有数据,则保留这些数据。

追答

我觉得 其实 E~I 列 其实完全没有必要 用程序处理 因为 我觉得 最重要的 还是 前面那B~D 这三列 你要保持一个 “规则性”,后边的 各列 我觉得 应该都是变化的 即使等于上面得了 也要进行修改的……你说是不是?

已经修改了一下 按着你说的 这些新的要求!

不过 我建议 你把对这几列的数据处理的代码删除掉比较好 完全用手工输入 !

本回答被提问者采纳
相似回答