Sample Programs for the Agilent 34401A Digital Multimeter
(Note: These programs will also work for the Agilent 34410A and most other DMM's.)
These examples and others are included in the 'C:\Program Files\spBasic\AddIns\Agilent\34401ADmm\Examples\' directory in the free fully-functional download.
Set DMM Functions Program
Set DMM Display Message
Test Status Routines
Test Trigger Options
Read Multipoint Measurements
Fetch Multipoint Measurements
Read And Display Measurements
Read And Shift Measurements
Read Measurements In Program Loop
Read Measurements in More Accurate Loop
Capture Measurement Condition
Running spBasic Programs, Statements, and Functions from VBA Forms
Software Trigger Test
Test Math Functions
Set DMM Functions Program
This program sets the 11 DMM functions of the 34401A. It sets the function, waits one second, then reads the function into a variable. You can watch the meter change functions on the meter display. You can copy the listing below and paste it into the spBasic Edit Form. You need the variable 'functNumber' defined in a Variables column.
// ----- DMMFunctions -----
a401_AddDevice "a401Dmm"
a401_Initialize "GPIB0::8::INSTR"
// -- test function commands - DC Volts, etc. --
a401_SetFunctDCVolts
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctACVolts
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctDCCurrent
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctACCurrent
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunct2WireRes
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunct4WireRes
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctFrequency
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctPeriod
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctDCRatioVolt
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctContinuity
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctDiode
functNumber = a401_GetDmmFunction()
WaitMs 1000
a401_SetFunctDCVolts
functNumber = a401_GetDmmFunction()
End
|
Below is a screen shot of the program in the Edit Form.

Set DMM Display Message
This program sets a message to the DMM display and tests the enable, disable, and clear commands. Step through the program using Debug and watch the DMM display. You can copy the listing below and paste it into the spBasic Edit Form.
|
// ----- DisplayMessage -----
a401_AddDevice "a401Dmm"
a401_Initialize "GPIB0::8::INSTR"
// -- step through the program using Debug and watch the DMM display --
a401_SetDisplayText "Hello World"
a401_ClearDisplay
a401_DisableDisplay
Stop
a401_SetDisplayText "Hello World"
a401_EnableDisplay
a401_ClearDisplay
End
|
Below is a screen shot of the program in the Edit Form.

Test Status Routines
This program sets and reads the Agilent 34401A Status registers. The variables and program are shown below. To run this program, the 'Analysis ToolPak' and 'Analysis ToolPak - VBA' need to be installed as add-ins to Excel. These provide the 'dec2bin', 'hex2dec', etc. data conversion Excel functions.
Put the variables below into 2 columns, a Variables column and Variable Values column. Make sure the 'Resource' string in your Variable Values column matches your communication setup.
// variables
Resource GPIB0::8::INSTR
Status 0
end
|
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- StatusTest -----
a401_AddDevice "a401Dmm"
a401_Initialize Resource
clear status
// -- this gets the Summary sub register of the Status Byte register --
status = a401_GetStatusRegister("Stat", "Summ")
// -- this sets and gets the Enable sub register of the Status Byte register --
a401_SetStatusRegister "Stat", "Enab",hex2dec("38")
status = dec2bin(a401_GetStatusRegister("Stat", "Enab"),8)
// -- ClearRegisters shouldn't effect enable registers --
a401_ClearStatus
status = dec2bin(a401_GetStatusRegister("Stat", "Enab"),8)
a401_PresetRegisters
status = a401_SerialPoll()
// -- this sets and gets the Enable sub register of the Questionable Data register --
a401_SetStatusRegister "Ques", "Enab",hex2dec("1A03")
status = dec2hex(a401_GetStatusRegister("Ques", "Enab"),8)
// -- this sets and gets the Enable sub register of the Standard Event register --
a401_SetStatusRegister "Stan", "Enab",hex2dec("BC")
status = dec2bin(a401_GetStatusRegister("Stan", "Enab"),8)
End
|
Below is a screen shot of the program in the Edit Form.

Test Trigger Options
This program sets and reads the Agilent 34401A Trigger options. The variables and program are shown below.
// variables
Resource GPIB0::8::INSTR
TrigDelayIn 0.1
displayDelay 1000
trigSourceOut 1
valueIn 2
valueOut 2
end |
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- TriggerTest -----
a401_AddDevice "a401Dmm"
a401_Initialize Resource
// -- set trigger source --
a401_SetTrigSource "Ext"
trigSourceOut = a401_GetTrigSource()
a401_SetTrigSource "Bus"
trigSourceOut = a401_GetTrigSource()
a401_SendSoftwareTrig
valueOut = dec2bin(a401_SerialPoll(),8)
valueOut = dec2bin(a401_GetStatusRegister("stat","summ"),8)
valueOut = dec2bin(a401_GetStatusRegister("stan","event"),8)
a401_ClearStatus
valueOut = dec2bin(a401_SerialPoll(),8)
valueOut = dec2bin(a401_GetStatusRegister("stat","enab"),8)
a401_SetTrigSource "Imm"
trigSourceOut = a401_GetTrigSource()
valueIn="bus"
a401_SetTrigSource valueIn
valueOut = a401_GetTrigSource()
waitMs displayDelay
valueIn=.7
a401_SetTrigDelay valueIn
valueOut = a401_GetTrigDelay()
waitMs displayDelay
valueIn="On"
a401_SetTrigAutoDelay valueIn
valueOut = a401_GetTrigAutoDelay()
waitMs displayDelay
a401_Beep
end
|
Read Multipoint Measurements
This program reads 200 data points at a sample time of 1 millisec, and stores the values in an Excel cell range. The measured values for 100 data points were displayed on an Excel chart, which automatically plots the values in the cell range. The chart below shows the measured values from a 12V AC 60Hz Transformer output which was read by the Agilent 34401A in the DC Volt mode, at a 1 millisec sample rate. The DMM was set up in a multipoint trigger mode, and was configured for the fastest measurement speed. You can see that, in this configuration, the DMM can act as a low frequency storage scope. The minimum sample time for this model DMM is about 1 millisec.

// variables
Resource GPIB0::8::INSTR
timeOut 5
sampleTime 0.001
numLoops 200
end |
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- ReadMultiPoint -----
setUp401 // call the set-up program
timeOut=5 // 5 sec timeout
sampleTime = .001 // 1 ms sample time
numLoops = 200 // 200 data points
a401_ReadMultiPt timeOut, sampleTime, numLoops, sampleTime, 0, "measurements!d1", "measurements!e1"
a401_EnableDisplay
End
|
// ----- SetUp401 -----
// -- this sets up the DMM for the fastest sampling time --
a401_AddDevice "a401Dmm"
a401_Initialize Resource
a401_SetAutoZero "Off"
a401_SetTrigAutoDelay "Off"
a401_DisableDisplay
a401_SetAutoRangeDCVolt "Off"
a401_ConfigDCVolts 100, .01 // 100V, .01V resolution
a401_SetTrigSource "Imm" // Immediate mode, 0 delay
a401_SetTrigDelay 0
End
|
Fetch Multipoint Measurements
This program does the same thing as the ReadMultiPoint progam above, but it uses the 'a401_FetchMultiPt' statement instead. This statement gives you more control over the read process by using the 'Initiate' and 'WaitForOpComplete' statements. See the spBasic 'Help' for more info on the differences between these statements.
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- FetchMultiPoint -----
setUp401 // call the set-up program (see listing for Read Multipoint Measurements)
timeOut=5 // 5 sec timeout
sampleTime = .001 // 1 ms sample time
numLoops = 200 // 200 data points
// -- set up the trigger --
a401_SetTrigCount 1
a401_SetTrigSampCnt numLoops
a401_SetTrigDelay sampleTime
a401_SetTrigSource "Imm" //immediate trigger
a401_Initiate
// -- wait until the 200 points are taken --
a401_WaitForOpComplete timeOut
// -- get the data from the DMM --
a401_FetchMultiPt timeOut, sampleTime, 0, "measurements!d1", "measurements!e1"
a401_EnableDisplay
End
|
Read And Display Measurements
This statement is useful for displaying values on a chart as the data
is received from the DMM. The difference between this statement and 'FetchMultiPt' and
'ReadMultiPt' statements is that 'ReadAndDisplay' fills the Excel
columns as measurements are being taken, while 'FetchMultiPt' and
'ReadMultiPt' waits until all measurements are taken before the Excel
columns are filled.
Also, in 'ReadAndDisplay', the process can be
stopped by returning 'True' from a called function (not shown in this example), running the spBasic 'stopRun' macro, or by using the spBasic 'Stop' menu selection or 'Stop' button. The
process is automatically stopped after 'numPoints' have been
measured.
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- ReadAndDisplay -----
setUp401 // call the set-up program (see listing for Read Multipoint Measurements)
sampleTime = .1 // 100 ms sample time
numPoints = 50 // 50 data points
clear measurements!D1:e50 // clear the measurement columns
a401_ReadAndDisplay sampleTime, numPoints, sampleTime, 0, "measurements!D1", "measurements!E1", "measurements!b1", "measurements!c1"
a401_EnableDisplay
End
|
This program takes 50 measurements at .1 second intervals.
The Time values start at cell 'D1', and the measurement values start at
cell 'E1'. The columns D and E starting at row 1 are used to chart the
Volts vs. Time data. The current sample time and measurement are
displayed in cells 'B1' and 'C1'.
Read And Shift Measurements
This statement is useful for displaying values on a chart in an oscillosope type display, where data is shifted right-to-left as new data is received from the DMM. The difference between this statement and 'ReadAndDisplay' is that
'ReadAndDisplay' fills an Excel column with a fixed number of values
and then stops. The 'ReadAndShift' statement continuously reads the DMM
and puts the current value in the last cell of a cell range,
after shifting the previous values up one cell. When the cell values are displayed on an Excel chart,
the effect is a 'Strip Chart' of continuously measured values moving
from right to left. As in 'ReadAndDisplay', the process can be
stopped by returning 'True' from a called function (not shown in this example), running the spBasic 'stopRun' macro, or by using the spBasic 'Stop' menu selection or 'Stop' button..
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- ReadAndShift -----
setUp401 // call the set-up program (see listing for Read Multipoint Measurements)
sampleTime = .1 // 100 ms sample time
clear measurements!D1:e50
a401_ReadAndShift sampleTime, sampleTime, "measurements!D1:D50", "measurements!E1:E50", "measurements!b1", "measurements!c1"
a401_EnableDisplay
End
|
This program takes continuous measurements at .1 second intervals and displays them in a 'strip chart' format.
The Time values start at cell 'D1', and the measurement values start at cell 'E1'. Both the time values and measurement values are shifted up every .1 sec. The columns D and E starting at row 1 are used to chart the Volts vs. Time data. The current sample time and measurement are displayed in cells 'B1' and 'C1'.
Read Measurements in Program Loop
A simple program loop can be used to read DMM measurements using the 'Read' function as shown below. You can also do other things in the loop such as compute averages, control other equipment, compute stop values, etc. You can test for certain conditions and exit the loop when the conditions are met. A For-Next loop is shown here. You can also use a do-while loop in the same fashion. You can copy the listing below and paste it into the spBasic Edit Form.
// ----- ReadInLoop -----
setUp401 // call the set-up program
sampleTime = .5 // 500 ms sample time
numLoops = 20 // 20 measurements
clear measurements!D1:e<<numloops>> //clear d1:e20
for x = 3 to 3 + numLoops - 1 //start at row 3
WaitMs sampleTime*1000 // wait .5 sec
measurements!d<<x>> = (x - 2)*SampleTime // put time axis in col D
measurements!e<<x>> = a401_Read(1000) // read measurement with 1 sec timeout, put in col E
next
a401_EnableDisplay
End
|
Read Measurements in More Accurate Loop
This program is the same as the program above but uses a more accurate timing method. The progam uses the 'WaitUntilSysTime' function. This function waits until a specific system time and is used primarily
in 'For' or 'Do While' loops to implement delays. Using this function
gives more accurate delays than a 'WaitMs' or 'WaitSec' statement since
it compensates for statement execution time within the loop. This statement
should be used for short delays since it cannot be interrupted by the
Debug 'Exit' button or a 'StopProgram' macro.
// ----- ReadInMoreAccurateLoop -----
setUp401 // call the set-up program
sampleTime = .5 // 500 ms sample time
numLoops = 20 // 20 measurements
clear measurements!D1:e<<numloops>> //clear d1:e20
initTime = systemTime() // get the system time
for x = 3 to 3 + numLoops - 1 //start at row 3
initTime = WaitUntilSysTime(initTime + sampleTime*1000) // wait .5 sec
measurements!d<<x>> = (x - 2)*SampleTime // put time axis in col D
measurements!e<<x>> = a401_Read(1000) // read measurement with 1 sec timeout, put in col E
next
a401_EnableDisplay
End
|
Capture Measurement Condition
This program displays the meter measurements on a worksheet. The measurements stop when the "Stop" button is pushed or when the measured value meets certain conditions.

// ----- getDCMeasurement -----
setupMeter // this routine sets up the meter parameters
// -- configure the DMM with range and resolution --
a401_ConfigDCVolts 10, .0001
// -- get the measurement function from the meter --
gaStr = a401_GetDmmFunction() // gaStr is a global variable
if gaStr="Volt" then
gaStr = "DC Volts"
endif
c1 = " " & gaStr // display the measurement units in cell c1
// -- disable the DMM display --
a401_DisableDisplay
// -- loop until stop button is pressed --
On Stop GoTo 10 // when 'Stop' is pushed, go to line 10 below
do while true
// -- read the DMM --
b1 = a401_Read(3)
// -- you can do a test of the reading here and exit the loop at certain conditions --
if abs(b1) > .8 then // exit if the absolute measurement value > .8 volt
a401_Beep // beep the meter
exit do // exit the loop
endif
// -- wait for number of sec in cell c3 --
waitsec c3 // wait between measuremets
loop
10:
// -- turn display back on --
a401_EnableDisplay
End
|
// ----- SetupMeter -----
a401_AddDevice "a401Dmm"
a401_ConfigSerialPort 9600,0,8,2
a401_Initialize ResourceName
if not(a401_GetResetFlag()) then
a401_Reset
endif
a401_ClearStatus
End
|
Running spBasic Programs, Statements, and Functions from VBA Forms
This example shows how VBA forms can run spBasic Programs, Statements, and Functions. The VBA code in the User Form selects the DMM Voltage measurement mode, either DC or AC, when the option button is selected. It then makes a measurement and displays the measurement value in the Textbox. This is all done by VBA calling an spBasic program, spBasic statements, and spBasic functions.

' *****************************************************************************
' VBA code for the User Form "RunStatement" Form
' *****************************************************************************
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub UserForm_Activate()
On Error GoTo ErrorHandler
' -- you have to run an initial spBasic program 'SetupMeter' to set and initialize the active device --
Application.Run "SpBasicAddIn.xla!runProgram", "'[spbAgilent34401Atest.xls]Using forms'!SetupMeter"
' ----- the 'SetupMeter" spBasic program that was run in the Edit Form is listed below ----
'// ----- SetupMeter -----
'a401_AddDevice "a401Dmm"
'a401_Initialize "GPIB0::8::INSTR"
'a401_ClearStatus
'End
Exit Sub
ErrorHandler:
MsgBox " Error # " & CStr(Err.Number) & ", " & Err.Description, , "RunProgram Error"
End Sub
Private Sub optVoltsDC_Click()
On Error GoTo ErrorHandler
' -- configure meter using spBasic statement "a401_ConfigDCVolts" 10V range, resolution of .0001 Volts --
runStatement "a401_ConfigDCVolts", 10, 0.0001
Sleep 100 ' Delay 100 ms before read
' -- read the voltage using the spBasic "a401_Read" function with 3 sec timeout --
TextBox1.Text = runStatement("a401_Read", 3)
Exit Sub
ErrorHandler:
MsgBox " Error # " & CStr(Err.Number) & ", " & Err.Description, , "VDC mode Error"
End Sub
Private Sub optVoltsAC_Click()
On Error GoTo ErrorHandler
' -- configure meter using spBasic statement "a401_ConfigACVolts" 10V range, resolution of .0001 Volts --
runStatement "a401_ConfigACVolts", 10, 0.0001
Sleep 100 ' Delay 100 ms before read
' -- read the voltage using the spBasic "a401_Read" function with 3 sec timeout --
TextBox1.Text = runStatement("a401_Read", 3)
Exit Sub
ErrorHandler:
MsgBox " Error # " & CStr(Err.Number) & ", " & Err.Description, , "VAC mode Error"
End Sub
Private Function runStatement(statementString, Optional arg1, Optional arg2, Optional arg3, Optional arg4, Optional arg5)
' -- run an spBasic statement or function --
runStatement = Application.Run("SpBasicAddIn.xla!executeSpbInstrStatementOrFunct", statementString, arg1, arg2, arg3, arg4, arg5)
End Function
|
Software Trigger Test
The VBA Form below is used to run a test program which sends a software trigger to the DMM and initiates a measurement.

When the 'Run Software Trigger Test' button is pushed, the VBA button-click subroutine below is executed.
Private Sub CommandButton2_Click()
' -- run software trigger test --
Application.Run "SpBasicAddIn.xla!runProgram", "[spbAgilent34401Atest.xls]Measurements!SoftwareTriggerTest"
End Sub
|
This runs the spBasic progam 'SoftwareTriggerTest' in the 'Measurements' worksheet in workbook 'spbAgilent34401Atest.xls'. This spBasic program that appears in the spBasic Edit Form is shown below.
// ----- SoftwareTriggerTest -----
setupMeter
a401_ConfigDCVolts 10, "max"
// ---- Software Trigger Example ----
clear measurements!D2:e50
deltaT =.1 // 100 ms between samples
numFetchPoints = 100
// -- set up the trigger to take 'numFetchPoints', 'deltaT' seconds apart
a401_SetTrigCount 1
a401_SetTrigSampCnt numFetchPoints
a401_SetTrigDelay deltaT
a401_SetTrigSource "Bus" //software trigger
// -- start taking measurements --
a401_Initiate
// -- you may want to wait before you do something --
//WaitSec waitTime // wait 'waitTime' sec
// ..you can do something here,
// like turn on a power supply, etc.
//msgbox "Power supply turned on"
// -- wait until the 'numFetchPoints' are taken --
a401_WaitForOpComplete numFetchPoints*deltaT+5, "spbAgilent34401ATest.xls!SoftwareTrigFunct", 30
// -- get the data from the device and put it in the 'Data' worksheet --
a401_FetchMultiPt 10, deltaT*1000, 0, "measurements!D1", "measurements!E1"
End
|
When a software trigger is used, the statement 'a401_WaitForOpComplete' calls the VBA function "spbAgilent34401ATest.xls!SoftwareTrigFunct". 'WaitForOpComplete' waits until the VBA function returns 'True', it then issues the software trigger to the DMM. 'WaitForOpComplete' then returns when the instrument completes the operation. The VBA 'SoftwareTrigFunct' is,
Function SoftwareTrigFunct(ByVal elapsedTimeMs As Long, ByVal waitingForTrig As Boolean) As Boolean
'-------------------------------------------------------------------------- -
' This sample function is used with 'WaitForOpComplete' for two things
' 1) If the 'waitingForTrig' input is True, you can decide when to issue a software
' trigger to begin the measurements. The 'elapsedTimeMs' input gives the elapsed
' time since 'WaitForOpComplete' is called. The software trigger is issued by 'WaitForOpComplete'
' when this function returns 'True'.
' 2) If the 'waitingForTrig' input is False, a software trigger has already been issued. The
' 'elapsedTimeMs' input gives the elapsed time since the trigger was issued. You can
' use this to time an event (such as turning on a power supply) to occur a certain time
' after measurements were started.
'-------------------------------------------------------------------------- -
Static messageBoxDisplayed As Boolean
' -- initialize variables - you do this when elapsedTime = 0 --
If elapsedTimeMs = 0 Then
If waitingForTrig Then
' -- 'dataButtonPushed' is a Module public variable, set by a "btnGetData_Click" event --
' -- initialize 'dataButtonPushed' --
dataButtonPushed = False
Else
' -- initialize a function Static variable, this value is maintained between function calls.
' You could also use a module private variable --
messageBoxDisplayed = False
End If
End If
' -- set return value --
SoftwareTrigFunct = False
If waitingForTrig Then
' -- send the software trigger after 5 sec or when the
' 'get data' button was pushed --
If elapsedTimeMs >= 5000 Or dataButtonPushed Then
' -- set return value True to send the software trigger --
SoftwareTrigFunct = True
End If
Else
' -- display the test message box 1 second after the trigger is sent, you could do
' something here like turning on a power supply. You could also turn off the power supply
' at some later time. Also you could control supply voltage using a computed
' function of time using any algorithm you choose --
If Not messageBoxDisplayed And elapsedTimeMs >= 1000 Then
MsgBox "One second has elapsed since the software trigger was sent, you could do something here like turning on a power supply, controlling supply voltage, etc."
messageBoxDisplayed = True
End If
End If
End Function
|
Test Math Functions
The Math program below tests some of the Agilent 34401A Math functions. It takes readings from the DMM and retrieves the the average, count, min, and max values from the DMM, then computes the Average using the Excel average function. It then displays the results in a message box shown here.

// variables
MathFunctionCode Aver
FunctionCodeOut AVER
Enabled On
EnabledOut 1
NullOffset 1
NullOffsetOut 1.00E+00
dBReference 125
dBReferenceOut 1.25E+02
RefResistance 8000
RefResistanceOut 8.00E+03
UpperLimit 20
UpperLimitOut 2.00E+01
LowerLimit -20
LowerLimitOut -2.00E+01
Average 0.62628
count 5.00E+01
min -1.5854E+01
max 1.5849E+01
ExcelAverage 0.62628
end
|
You can copy the listing below and paste it into the spBasic Edit Form.
// ----- Math -----
setUp401 // call the set-up program
// -- clear the output variables --
clear FunctionCodeOut,EnabledOut,NullOffsetOut,dBReferenceOut, RefResistanceOut,UpperLimitOut, LowerLimitOut
a401_SetMathFunction MathFunctionCode
FunctionCodeOut = a401_GetMathFunction()
a401_SetMathEnabled Enabled
EnabledOut = a401_GetMathEnabled()
a401_SetMathNullOffset NullOffset
NullOffsetOut= a401_GetMathNullOffset()
a401_SetMathdBReference dBReference
dBReferenceOut = a401_GetMathdBReference()
a401_SetMathdBmRefResist RefResistance
RefResistanceOut = a401_GetMathdBmRefResist()
a401_SetMathLowerLimit LowerLimit
LowerLimitOut = a401_GetMathLowerLimit()
a401_SetMathUpperLimit UpperLimit
UpperLimitOut = a401_GetMathUpperLimit()
// -- set Average math function --
a401_SetMathFunction "Aver" // -- start taking the average --
a401_SetMathEnabled "on"
sampleTime = .1 // 100 ms sample time
numPoints = 50 // 50 data points
clear measurements!D1:e50
a401_ReadAndDisplay sampleTime, numPoints, sampleTime, 0, "measurements!D1", "measurements!E1", "measurements!b1", "measurements!c1"
// -- stop taking the average --
a401_SetMathEnabled "off"
Average = a401_GetMathAverage()
Count = a401_GetMathAverageCount()
Min = a401_GetMathAverageMin()
Max = a401_GetMathAverageMax()
ExcelAverage=Average(measurements!e1:e50)
// -- display the results in a message box --
MsgBox "Count =" & Count & " samples" & CHAR(10) & "Average = " & Average & " volts" & CHAR(10) & "Minimum = " & Min & " volts" & CHAR(10) & "Maximum = " & Max & " volts" & CHAR(10) & "Excel Average = " & ExcelAverage
End
|
|
Live Excel Help!
Free initial talk time, no charge until you're convinced that the expert can help you!
|