excel - 范围输入
问题描述
不太确定我的代码有什么问题,但它没有在一个直列中打印。当你说它有效
cells(i,j).copy
range(i,j).pastespecial
但是当您请求一系列值时,会抛出完全随机的单元格中的值,例如
set rng=Application.inputbox(" Please select range", Type=:8)
除非您要求用户选择范围,否则一切正常。
Sub select1()
Dim rng As Variant
Dim i, j, k As Integer
Set rng = Application.InputBox("please select range", Type:=8)
With ActiveSheet
i = 1
k = 1
For j = 1 To rng.Columns.Count
For i = 1 To rng.Rows.Count
rng(Cells(i, j)).Copy
Range("l" & k).PasteSpecial
k = k + 1
Next i
i = 1
Next j
End With
End Sub
所以对于这张表
jenny doon felix spi gav benj amanda
jenny doon felix spi gav benj amanda
jenny doon felix spi gav benj amanda
jenny doon felix spi gav benj amanda
jenny doon felix spi gav benj amanda
jenny doon felix spi gav benj amanda
我必须得到(在 1 列中)
jenny
jenny
jenny
jenny
jenny
doon
doon
doon
doon
doon
felix
felix
felix
felix
felix
spi
spi
spi
spi
spi
gav
gav
gav
gav
gav
benj
benj
benj
benj
benj
解决方案
这个
rng(Cells(i, j)).Copy
Range("L" & k).PasteSpecial
应该
rng.Cells(i, j).Copy
.Range("L" & k).PasteSpecial
或者
rng.Cells(i, j).Copy Destination:=.Range("L" & k)
或者,如果您只想复制该值,那么这会更好:
.Range("L" & k).Value = rng.Cells(i, j).Value
总的来说,我推荐以下
为您引入一些错误处理,
Application.InputBox
否则如果用户按下Cancel按钮,它将失败。测试是否选择了多个区域(我们不知道如何处理它们,所以我们需要禁止它们)。
使用数组:将源范围读入数组
SrcArr = SrcRng.Value
并使用数组进行输出ReDim DestArr(1 To SrcRng.Cells.Count, 1 To 1) As Variant
。这样,您只有一个单元格读/写操作,这使您的代码更快。转换完全在数组内执行。
所以你最终得到......</p>
Option Explicit
Public Sub TransformRange()
Dim SrcRng As Range
On Error Resume Next 'next line throws error if user presses cancel so hide all errors
Set SrcRng = Application.InputBox("please select range", Type:=8)
On Error GoTo 0 'don't forget to re-activate error reporting
If SrcRng Is Nothing Then Exit Sub
If SrcRng.Areas.Count > 1 Then
MsgBox "More than one area was selected I'm not sure what to do"
Exit Sub
End If
'read everything into an array
Dim SrcArr() As Variant
SrcArr = SrcRng.Value
'transform values
ReDim DestArr(1 To SrcRng.Cells.Count, 1 To 1) As Variant
Dim iRow As Long, iCol As Long, iArr As Long
iArr = 1 'initialize
For iCol = 1 To UBound(SrcArr, 2)
For iRow = 1 To UBound(SrcArr, 1)
DestArr(iArr, 1) = SrcArr(iRow, iCol)
iArr = iArr + 1
Next iRow
Next iCol
'write values into sheet
SrcRng.Parent.Range("L1").Resize(RowSize:=UBound(DestArr, 1)).Value = DestArr
'SrcRng.Parent <-- this represents the sheet of the selected range
End Sub
推荐阅读
- javascript - 在实时系统中更新内容的效率是什么?
- node.js - Uncaught SyntaxError: Unexpected token < runtime.4501af5c35d1125f6901.js:1 在运行 IISnode 时
- powershell - 删除空目录或仅包含 .txt 文件的目录
- xml - PowerShell 脚本读取 Xml 文件并仍然抛出异常
- node.js - 你如何在 AWS lambda 上安装 phantomjs?
- java - 在 Kotlin 转换期间删除了 Setter/Getter
- r - 在 r 中创建数据子集
- python - 在数百个 Excel 文件中更改 VBA 代码,而无需打开每个文件
- ios - 如何使用 SwiftUI 隐藏主页指示器?
- json - 将 Json 转换为包含对象列表的对象时出错