我是VBA的新手,我正在努力使这项工作成功。我需要一个宏来处理Sheet1
上的每个单元格列,并将结果放在Sheet2
上。我相信对于那些使用VB代码更高级的人来说,这很容易。它包含许多列..
只要我们遇到—
或空单元格,我们会在第一列填充-999
(请参阅Sheet2
上的示例),其中包含"0-2"
。然后,我们创建了2个新列,并在第一列填充0
,在第二列填充2
(请参阅Sheet2
上的示例)。如果仅在一侧找到值,则我们用相同的数字填充两侧。
正在处理Sheet1和
中的每个列Sheet 1中:
A B
Column1 Column2
Title Title2
0–2 0–4
3 —
— 5
—
— —
10–23 11—29
结果应该在Sheet2上看起来像这样。
Sheet 2中
A B C D
Column1 Column1 Column2 Column2
Title-A Title-B Title-A Title-B
0 2 0 4
3 3 -999 -999
-999 -999 5 5
-999 -999 -999 -999
—999 -999 -999 -999
10 23 11 29
答案 0 :(得分:1)
你真的不需要VBA这样做。它可以使用if函数完成。
第1列将使用类似:
=IF(ISNUMBER(Sheet1!A2),Sheet1!A2,IF(OR(Sheet1!A2="-",ISBLANK(Sheet1!A2)),-999,LEFT(Sheet1!A2,1)))
第2列将使用类似:
=IF(ISNUMBER(Sheet1!A2),Sheet1!A2,IF(OR(Sheet1!A2="-",ISBLANK(Sheet1!A2)),-999,RIGHT(Sheet1!A2,1)))
3和4将使用相同的1和2刚刚移过一列。
答案 1 :(得分:1)
好的,你的任务基本上是多部分的: 1 - 使用智能逻辑遍历工作表 2 - 分裂 3 - 将数据放入新单元格
这不是工作证明,但这应该会给你弹药来轻微地完成你的目标。
Sub mySub()
dim i,j,dummy,dummy2, blankCounter
i=1
j=1
blankCounter=0
'@@@@@@Section1
do while ThisWorkbook.Worksheets(1).Cells(1, j)<>""
do while blankCounter<=5
if ThisWorkbook.Worksheets(1).Cells(i, j)=""
blankCounter=blankCounter+1
else
'@@@@@@Section2
dummy=Split(ThisWorkbook.Worksheets(1).Cells(i, j),"—")
for k=0 to Ubound(dummy)
ThisWorkbook.Worksheets(2).Cells(i, j+k)=dummy(k)
next k
end if
i=i+1
loop
blankCounter=0
j=j+1
loop
end Sub
好的,用英语。第一部分正在研究这个工作簿(“这个”通常特别出现在java中,但这是一个更明显的例子)。在本工作簿中查看我的第一个工作表。在这个工作表中,让我们看一下col1,row1。现在我们将循环下行并继续前进,直到它们为空,对列进行相同操作。这基本上可以找到矩阵的维度(数据)。
好的,现在我们可以遍历工作簿,我们就在那里。
现在,您将了解VBA中的Split功能,该功能几乎存在于所有语言中。 Split会在String中查找某些内容,并按您提供的参数分解字符串。假人将保留任何返回值。假人的大小是未知的,所以我们不应该对此进行硬编码,否则当分离器不存在时会破坏。
话虽如此,我们现在介绍Ubound。 Ubound是一种查找数组大小的功能。注意:如果Ubound返回1,则表示您有一个值。数组自动索引为0,因此您必须注意这一点而不是从1循环到Ubound,这会产生错误并产生错误的代码。
好的,现在好了我们可以遍历我们的数组和我们的工作簿,现在我们只需要将这些值放在所需的单元格中。 var k应该能够为你做到这一点。
正如我所说,我没有证明这个代码,所以你需要确保这个逻辑正常运行,因为我现在意识到它并没有将数据放在正确的单元格中,但这将是你的解决方案。