简体   繁体   中英

Need a real VBA equivalent for Excel Value function

As mentioned in the title, I need a VBA equivalent to the Excel Value function. My data set looks like this: Data set example

What I am looking for is VBA code equivalent to this: =Value(A2)+Value(B2) . That would go in column C

The output must be the same as that function. For the given example, column C should end up looking like this: End product

More than that, it needs to only have the value in the cell after the macro is run, rather than displaying the value and still having that formula in it.

Here is what I have done so far:

For i = 1 To LastRow
   strValue = Val(sht.Range("A" & i))
   strValue1 = Val(sht.Range("B" & i))
   sht.Range("C" & i).Value = strValue + strValue1
Next i

I also tried variations on this, a couple of which are shown below:

For i = 1 To LastRow
   strValue = Evaluate(sht.Range("A" & i))
   strValue1 = Evaluate(sht.Range("B" & i))
   sht.Range("C" & i).Value = strValue + strValue1
Next i

For i = 1 To LastRow
   strValue = sht.Range("A" & i)
   strValue1 = sht.Range("B" & i)
   strVal = Evaluate(strValue)
   strVal1 = Evaluate(strValue1)
   sht.Range("C" & i).Value = strVal + strVal1
Next i

I can't find anything that will work for me. The output in C for the example set ends up being just 9. Pretty sure it is taking the first number in A and adding it to the first number in B. So when the hour in B changes to 1 C displays 10.

I also tried simply:

For i=1 To LastRow
   sht.Range("C" & i).Value = sht.Range("A" & i).Value + sht.Range("B" & i).Value
Next i

That just concatenated the text to the format 9/03/15 00:00:00

Any and all help appreciated. Bonus if you can point me in the right direction for changing the final C values from that number (ie. 42250.00017) to the custom date/time format 'yyyy-mm-dd hh:mm:ss' .

Edit: Here is my code up to the sticking point. Everything else works as I want it to, the only problem is with the last For loop.

Sub sbOrganizeData()

Dim i As Long
Dim k As Long
Dim sht As Worksheet
Dim LastRow As Long
Dim sFound As String
Dim rng As Range
Dim sheet As Worksheet
Dim Sheet2 As Worksheet
Dim strFile As String
Dim strCSV As String
Dim strValue As Double
Dim strValue1 As Double
Dim strVal As Long
Dim strVal1 As Long

Application.DisplayAlerts = False
Sheets("all016").Delete
Sheets("Sheet1").Delete
Application.DisplayAlerts = True
Set sheet = Sheets.Add
Set Sheet2 = Sheets.Add
sheet.Name = "all016"
Sheet2.Name = "Sheet1"

strFile = ActiveWorkbook.Path
strCSV = "*.csv"
sFound = Dir(strFile & "\*.csv")
If sFound <> "" Then
    Workbooks.Open Filename:=strFile & "\" & sFound
End If
Range("A1").CurrentRegion.Copy Destination:=Workbooks("solar.xlsm").Sheets("all016").Range("A1")
Workbooks(sFound).Close

Set sht = ThisWorkbook.Sheets("all016")
LastRow = sht.Cells.Find("*", searchorder:=xlByRows, searchdirection:=xlPrevious).Row

sht.Range("C1").EntireColumn.Insert

For i = 1 To LastRow
   'Code that doesn't quite work here'

   sht.Range("C" & i).NumberFormat = "yyyy-mm-dd hh:mm:ss"
Next i

The issue is that the dates and times are strings so something like this will work:

For i = 2 To LastRow
   strValue = Evaluate("VALUE(TRIM(" & sht.Range("A" & i).Address(1,1,,1) & "))")
   strValue1 = Evaluate("VALUE(TRIM(" & sht.Range("B" & i).Address(1,1,,1) & "))")
   sht.Range("C" & i).Value = strValue + strValue1
   'the format
   sht.Range("C" & i).NumberFormat = "mm/dd/yy hh:mm:ss"
Next i

You have to reference the .Value2 field of the range element as:

For i = 1 To LastRow
   sht.Range("C" & i).Value2 = sht.Range("A" & i).Value2 + sht.Range("B" & i).Value2
Next i

The value is free of formatting and just in Excel's time/date code as you want your final result to be. Cheers,

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM