Solved

Replacing Nulls with 0

Posted on 2011-03-14
11
266 Views
Last Modified: 2012-08-13
I have an access database which exports data out to an Excel spreadsheet.  Under certain conditions there may be Null values exported from the database which results in blank fields in the spreadsheet.  I want these blank cells to display 0.00 and have a numeric, not text, data type.  I am currently using the following code in Access to format the cells which display numeric values:  

Set xlRng = xlWs.Range(xlWs.Cells(2, 12), xlWs.Cells(x, z))
        xlRng.NumberFormat = "###,###,###,##0.00;[Red](###,###,###,##0.00)"
        Set xlRng = xlWs.Columns("I")
        xlRng.NumberFormat = "00"
        Set xlRng = xlWs.Columns("J")
        xlRng.NumberFormat = "###,###,###,##0;[Red](###,###,###,##0)"

Any help would be greatly appreciated
0
Comment
Question by:cekendricks
11 Comments
 
LVL 119

Expert Comment

by:Rey Obrero
ID: 35130959
if you are exporting a table, use a query against the table and export the query.

in the query, use nz([fieldName],0) for the field that may contain null values
0
 

Author Comment

by:cekendricks
ID: 35131021
Yeah I already thought of that, but the problem is that I would have to change the fieldname in the query (ie newFieldName: Nz([FieldName], 0).  This would be just too time consuming to do as there are 12 queries (one for each month), with each query containing up to 100 fields that could potentially yield null values.  I figured that since they all have to be formatted once exported to the spreadsheet that this would be best place to search out and replace any Nulls.
0
 

Author Comment

by:cekendricks
ID: 35131198
Well after searching some more I found this simple little snippet of code, which while it take a long time go through and clean up a 7,000 record spreadsheet, it nontheless does do the trick:

Sub BlankMe()
    For Each c In ActiveSheet.UsedRange
        If c.Value = "" Then c.Value = "-"
        c.HorizontalAlignment = xlCenter
    Next c
End Sub
0
 
LVL 74

Expert Comment

by:Jeffrey Coachman
ID: 35138721
First,  the "0.00" is a "Format"
Access can only export the raw "0", it can't force a format in Excel.
So you can import the Zero, then simply format it in Excel (simple)
0
Ransomware-A Revenue Bonanza for Service Providers

Ransomware – malware that gets on your customers’ computers, encrypts their data, and extorts a hefty ransom for the decryption keys – is a surging new threat.  The purpose of this eBook is to educate the reader about ransomware attacks.

 
LVL 32

Accepted Solution

by:
Rob Henson earned 500 total points
ID: 35173368
You could do an Edit Replace on the dataset once in Excel. Select the data area and then run the Edit Replace function.

In the Find box - leave Blank
In the Replace With - type 0

Expand options if not already expanded and select the Match whole cells option.

This will be doing the same as the code you found but using an inbuilt function may do it quicker.

Cheers
Rob H
0
 
LVL 32

Expert Comment

by:Rob Henson
ID: 35713193
My objection to cekendric solution is that the asker specifically asked for a numeric value and this solution would put text in the cell.

Regards
Rob H
0
 
LVL 32

Expert Comment

by:Rob Henson
ID: 35713199
Therefore a simple change to the code would be

c.value = 0
0
 
LVL 92

Expert Comment

by:Patrick Matthews
ID: 35713616
I agree that the recommended comment does not answer the question as asked, which required that all values be numeric.

While I also agree with cap1 in that the best practice is to control the output with the query, and thus use Nz, if the Asker is opposed to that then I would recommend using robhenson's approach suggested in http:#a35173368

Implementing that in VBA code would look something like this:

Sub Export()
    
    Dim xlApp As Object
    Dim xlWb As Object
    Dim xlWs As Object
    Dim r As Long
    Dim c As Long
    
    Const WbPath As String = "c:\Foo.xlsx"
    
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "Table1", WbPath
    
    Set xlApp = CreateObject("Excel.Application")
    Set xlWb = xlApp.Workbooks.Open(WbPath)
    Set xlWs = xlWb.Worksheets(1)
    
    With xlWs
        r = .UsedRange.Rows.Count
        c = .UsedRange.Columns.Count
        .Range(.Cells(2, 1), .Cells(r, c)).Replace "", 0
    End With
    
    With xlWb
        .Save
        .Close
    End With
    Set xlWs = Nothing
    Set xlWb = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    
    MsgBox "Done"
    
End Sub

Open in new window


Using the Replace method will be orders of magnitude faster than looping through the range and substituting null values with a zero, as in http:#a35713199

Patrick
0
 

Expert Comment

by:_alias99
ID: 35744749
All,
 
Following an 'Objection' by robhenson (at http://www.experts-exchange.com/Q_27024483.html) to the intended closure of this question, it has been reviewed by at least one Moderator and is being closed as recommended by the Expert.
 
At this point I am going to re-start the auto-close procedure.
 
Thank you,
 
_alias99
Community Support Moderator
0

Featured Post

Comprehensive Backup Solutions for Microsoft

Acronis protects the complete Microsoft technology stack: Windows Server, Windows PC, laptop and Surface data; Microsoft business applications; Microsoft Hyper-V; Azure VMs; Microsoft Windows Server 2016; Microsoft Exchange 2016 and SQL Server 2016.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

How to quickly and accurately populate Word documents with Excel data, charts and images (including Automated Bookmark generation) David Miller (dlmille) Synopsis In this article you’ll learn how to use ExcelToWord! to copy data,charts, shapes …
Experts-Exchange is a great place to come for help with solutions for your database issues, and many problems are resolved within minutes of being posted.  Others take a little more time and effort and often providing a sample database is very helpf…
The viewer will learn how to use the =DISCRINV command to create a discrete random variable, use this command to model a set of probabilities and outcomes in a Monte Carlo simulation, and learn how to find the standard deviation of a set of probabil…
Graphs within dashboards are meant to be dynamic, representing data from a period of time that will change each time the dashboard is updated with new data. Rather than update each graph to point to a different set within a static set of data, t…

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

27 Experts available now in Live!

Get 1:1 Help Now