Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4862|回复: 18

[已解决]求将三列插值成二维表的VBA代码

[复制链接]
发表于 2015-8-17 23:22 | 显示全部楼层 |阅读模式
原始为三列数,想把它插值成二维表;第一列为二维表的列标(范围为最大值和最小值,步长可以设置);第二列为行标(范围最大值和最小值,步长可以设置),第三列为黄色区域。
捕获.PNG

见附件:
将三列插值成二维表.rar (12.8 KB, 下载次数: 19)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-8-18 08:55 | 显示全部楼层
Sub test1()
    Dim rng As Range
    Dim pc As PivotCache
    Dim pt As PivotTable

    Set rng = Sheets(1).Range("a2:c" & Sheets(1).Range("a65536").End(xlUp).Row)
    Sheets.Add after:=Sheets(Sheets.Count)
    '创建 数据透视表的缓存(PivotCache 对象)
    Set pc = ThisWorkbook.PivotCaches.Create(xlDatabase, rng, 1)

    Set pt = pc.CreatePivotTable([A1])
    With pt
        .PivotFields("A").Orientation = xlColumnField
        .PivotFields("B").Orientation = xlRowField
        .PivotFields("C").Orientation = xlDataField
        .ColumnGrand = False '隐藏列总计
        .RowGrand = False '隐藏行总计
    End With
    Range("a1").CurrentRegion.EntireColumn.AutoFit
End Sub

将三列插值成二维表2.rar (22.21 KB, 下载次数: 10)
回复

使用道具 举报

发表于 2015-8-18 11:20 | 显示全部楼层
  1. Option Explicit
  2. Sub ReorganizeData()
  3. Dim arrR(), arrC(), arr, arrO, TRs As Integer, TCs As Integer, i As Integer, j As Integer, Multiple As Integer
  4. Multiple = InputBox("请输入你要设置的步长", "步长设置", 5)
  5. If Len(Multiple) = 0 Then Exit Sub
  6. i = 0
  7. Do
  8.     i = i + 1
  9.     ReDim Preserve arrC(1 To i)
  10.     arrC(i) = Application.WorksheetFunction.MRound(Application.WorksheetFunction.Min(Range("A:A")), Multiple) + (i - 1) * Multiple
  11. Loop Until arrC(i) = Application.WorksheetFunction.MRound(Application.WorksheetFunction.Max(Range("A:A")), Multiple)
  12. i = 0
  13. Do
  14.     i = i + 1
  15.     ReDim Preserve arrR(1 To i)
  16.     arrR(i) = Application.WorksheetFunction.MRound(Application.WorksheetFunction.Min(Range("B:B")), Multiple) + (i - 1) * Multiple
  17. Loop Until arrR(i) = Application.WorksheetFunction.MRound(Application.WorksheetFunction.Max(Range("B:B")), Multiple)
  18. arr = Range("A3:C" & Range("A65536").End(xlUp).Row)
  19. ReDim arrO(1 To UBound(arrR), 1 To UBound(arrC))
  20. For j = 1 To UBound(arr)
  21.     arrO(Application.WorksheetFunction.Match(Application.WorksheetFunction.MRound(arr(j, 2), Multiple), arrR, 0), Application.WorksheetFunction.Match(Application.WorksheetFunction.MRound(arr(j, 1), Multiple), arrC, 0)) = arr(j, 3)
  22. Next j
  23. Range("D2:D65536,E1:AZ65536").Clear
  24. Range("D2").Offset(0, 1).Resize(1, UBound(arrC)) = arrC
  25. Range("D2").Offset(1, 0).Resize(UBound(arrR), 1) = Application.Transpose(arrR)
  26. Range("D2").Offset(1, 1).Resize(UBound(arrO), UBound(arrO, 2)) = arrO
  27. End Sub
复制代码

将三列插值成二维表.zip

20.43 KB, 下载次数: 8

回复

使用道具 举报

发表于 2015-8-18 11:52 | 显示全部楼层
试试看。
将三列插值成二维表.rar (25.3 KB, 下载次数: 16)
回复

使用道具 举报

 楼主| 发表于 2015-8-18 20:07 | 显示全部楼层
suye1010 发表于 2015-8-18 11:20

谢谢你的答复,而我需要的是每一个步长(A,B都有对应的C)都有值存在。中间不应该有空值。画出来的是个曲面。
截图1.jpg
让我学习了
回复

使用道具 举报

 楼主| 发表于 2015-8-18 20:23 | 显示全部楼层
爱疯 发表于 2015-8-18 08:55
Sub test1()
    Dim rng As Range
    Dim pc As PivotCache

白天公司不能上网,回复慢了请见谅,谢谢你的答复。你的代码和我想要的有区别。


RTX截图未命名.jpg
回复

使用道具 举报

 楼主| 发表于 2015-8-18 20:38 | 显示全部楼层
gufengaoyue 发表于 2015-8-18 11:52
试试看。

非常感谢你的答复,你的代码非常接近我的需求。
1、但是不应该出现空值。
RTX截图未命名1.jpg
2、三列数的三点分布
RTX截图未命名2.jpg
3、通过你的代码的到的是这样的。
RTX截图未命名3.jpg
4、我想要的是所有的步长都有对应的值
回复

使用道具 举报

发表于 2015-8-19 08:59 | 显示全部楼层
只能怪楼主。你看你里面解释清楚了吗?也许你相当清楚,可别人能看懂吗?而且你连个示例也不做个出来。
看到你说的“插值”,可又象是表格的变形。究竟是什么?真的搞不懂

回复

使用道具 举报

 楼主| 发表于 2015-8-19 22:08 | 显示全部楼层
上清宫主 发表于 2015-8-19 08:59
只能怪楼主。你看你里面解释清楚了吗?也许你相当清楚,可别人能看懂吗?而且你连个示例也不做个出来。
看 ...

谢谢了!确实有点不清楚。我想做的是有发动机的万有特性数据转速,扭矩,比油耗(三列数)原始数据,现有不在原始数据中的转速和扭矩,怎么插值比油耗出来。


回复

使用道具 举报

发表于 2015-8-19 22:28 | 显示全部楼层
克鲁德007 发表于 2015-8-19 22:08
谢谢了!确实有点不清楚。我想做的是有发动机的万有特性数据转速,扭矩,比油耗(三列数)原始数据,现有不 ...

1)没理解步长,围观来学习。
2)可以上传7楼图片2的excel文件吗?为了看下图2的图表
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 06:36 , Processed in 0.575435 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表