【问题标题】:How can I paste data from array to specific range (row)如何将数组中的数据粘贴到特定范围(行)
【发布时间】:2021-02-24 13:22:12
【问题描述】:

我是 EXCEL VBA 的初学者,我想为股票交易创建自己的交易日记。

  1. 我创建了一个简单的计算器来计算进入交易的价值。单击“SEND TO ACTIVE>”后,值将保存在创建的数组中,并将保存在“Active >>>”表中的第一个空闲行上。目前我的数据只从 B21 行写入,但是我需要从 B5 行保存它。该表限制为 13 条记录(足够了)。我在交易结束后手动添加“收盘价”单元格。Screenshot1 - paste data from array to specific row - Active table

  2. 完成交易后,我需要将该行移至“交易历史>>>”表。单击“>发送到历史”按钮后,我需要删除当前行中的数据并将其移动到下表中的新行。我需要最新数据始终位于顶部 - 所以创建一个新行并将所有已保存的数据移到下一行。Screenshot2 - paste data from array to specific row - History table

我还需要自动计算行中的以下值:

Date Close = add Current Date

Day = Date Close - Date Open

Profit / Loss = Close Price - Entry Price

Result = if Profit / Loss is a positive number so write "WIN" otherwise write "LOSE".

如果您能至少在某些方面给我建议,我将非常高兴。非常感谢!

这是我将数组中的数据插入新行的代码:

Sub Save_calc()
'Define an array to contain your data
Dim DatAa() As Variant
ReDim DatAa(1 To 1, 1 To 12)

'Define the sheet you want to work on
Dim wS As Worksheet
Set wS = ThisWorkbook.ActiveSheet

'Fill the data array
DatAa(1, 1) = "=TODAY()"
DatAa(1, 2) = "///"
DatAa(1, 3) = "///"
DatAa(1, 4) = wS.Range("Q14").Value
DatAa(1, 5) = "Stock"
DatAa(1, 6) = wS.Range("Q7").Value
DatAa(1, 7) = wS.Range("S9").Value
DatAa(1, 8) = wS.Range("Q9").Value
DatAa(1, 9) = ""
DatAa(1, 10) = wS.Range("Q10").Value
DatAa(1, 11) = wS.Range("Q11").Value
DatAa(1, 12) = wS.Range("S7").Value

'Find the first available row
Dim NextRow As Long
NextRow = wS.Range("B" & wS.Rows.Count).End(xlUp).Row + 1
'Print your data in there
wS.Range("B" & NextRow).Resize(UBound(DatAa, 1), UBound(DatAa, 2)).Value = DatAa

End Sub

【问题讨论】:

  • 你的图片很混乱。如果您可以发布“粘贴”之前和之后的图像,这可能会变得清晰。
  • 好的,我明白了,谢谢。明天我将发送之前和之后的图像。

标签: excel vba range


【解决方案1】:
Sub Save_calc()
    'Define an array to contain your data
    Dim DatAa() As Variant
    ReDim DatAa(1 To 1, 1 To 12)
    
    'Define the sheet you want to work on
    Dim wS As Worksheet
    Set wS = ThisWorkbook.ActiveSheet
    
    'Fill the data array
    DatAa(1, 1) = Date
    DatAa(1, 2) = "///"
    DatAa(1, 3) = "///"
    DatAa(1, 4) = wS.Range("Q14").Value
    DatAa(1, 5) = "Stock"
    DatAa(1, 6) = wS.Range("Q7").Value
    DatAa(1, 7) = wS.Range("S9").Value
    DatAa(1, 8) = wS.Range("Q9").Value
    DatAa(1, 9) = ""
    DatAa(1, 10) = wS.Range("Q10").Value
    DatAa(1, 11) = wS.Range("Q11").Value
    DatAa(1, 12) = wS.Range("S7").Value
    
    'Find the first available row
    Dim NextRow As Long
    NextRow = wS.Range("B18").End(xlUp).Row + 1
    
    Dim iAnswer As Integer
    If wS.Range("b5") = "" Then
    Else
        If NextRow = 5 Then
            iAnswer = MsgBox("Data has been exceeded. Would you like to erase existing data?", vbYesNo)
            If iAnswer = vbYes Then
                wS.Range("b5", "m17") = Empty
            Else
                Exit Sub
            End If
        End If
    End If
    'Print your data in there
    wS.Range("B" & NextRow).Resize(UBound(DatAa, 1), UBound(DatAa, 2)).Value = DatAa

End Sub
Sub SendToHistory()
    'Define an array to contain your data
    Dim vData As Variant
    Dim vHistory As Variant
    Dim rngHistory As Range
    
    'Define the sheet you want to work on
    Dim wS As Worksheet
    Set wS = ThisWorkbook.ActiveSheet
    
    
    
    'Find the first available row
    Dim NextRow As Long
    NextRow = wS.Range("B18").End(xlUp).Row
    
    If NextRow = 4 Then
        If wS.Range("b5") <> "" Then
            NextRow = 17
        Else
            MsgBox "No Data!!"
            Exit Sub
        End If
    End If
        
    
    Dim Target As Range
    
    Set Target = wS.Range("B" & NextRow).Resize(1, 12)
    vData = Target
    Target = Empty
    'date closed current date
    vData(1, 2) = Date
    vData(1, 3) = vData(1, 2) - vData(1, 2) 'day
    vData(1, 10) = vData(1, 9) - vData(1, 8) 'Profit/Loss
    If vData(1, 10) >= 0 Then
        vData(1, 11) = "WIN"
    Else
        vData(1, 11) = "LOSE"
    End If
    vData(1, 12) = Empty 'Note
    
    
    NextRow = wS.Range("B" & wS.Rows.Count).End(xlUp).Row
    
    If NextRow > 18 Then
        Set rngHistory = wS.Range("B19", "M" & NextRow)
        
        vHistory = rngHistory
        rngHistory = Empty
    End If
    
    wS.Range("B19").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    If IsArray(vHistory) Then
        NextRow = wS.Range("B" & wS.Rows.Count).End(xlUp).Row + 1
        wS.Range("B" & NextRow).Resize(UBound(vHistory, 1), UBound(vHistory, 2)) = vHistory
    End If

End Sub

【讨论】:

  • 第一部分 - (SEND TO ACTIVE>) 非常棒!非常感谢你的帮助!第二部分 - 单击按钮 (SEND TO HISTORY>) 后出现运行时错误“13”类型不匹配,指的是代码行:wS.Range ("B19")。 Resize (UBound (DatAa, 1), UBound (DatAa , 2)) .Value = DatAa 同时,B5、B18、B19行的数据消失。如果我再次单击 (SEND TO HISTORY>) 按钮,B4 行也会消失:(
  • 必需功能:点击(SEND TO HISTORY>) 按钮后,B5 到 M5 范围内的第 5 行数据被提取 (CTRL + X) 并插入到 B19 到 M19 范围内的第 19 行。随后每次单击按钮 (SEND TO HISTORY>) 将具有相同的功能。并且所有“历史记录”都会自动下移 1 行到第 20 行。这可能吗?
  • 最后一个问题,如何计算这4个自动函数?单元格 C19 => “收盘日期” = 添加当前日期单元格 D19 => “日” = 收盘日期 - 开盘日期单元格 K19 => “盈利/亏损” = 收盘价 - 进入价格单元格 L19 => “结果” = 如果盈利/Loss 是一个正数,所以写“WIN”,否则写“LOSE”。
猜你喜欢
  • 2017-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多