Excel單元格空格的刪除是表哥表姐們?nèi)粘9ぷ髦薪?jīng)常遇到的問題,大多數(shù)人對(duì)這個(gè)問題的常規(guī)解決方法就是:
1、全選工作表,按ctrl+H鍵,彈出查找和替換工作框
2、在查找和替換工作框的“查找內(nèi)容”項(xiàng),輸入“ ”,在“替換為”項(xiàng),直接空著,什么都不用輸入

3、點(diǎn)擊“全部”替換項(xiàng),替換完成即可
一般情況下,以上三步即可完成工作表內(nèi)空格的刪除工作,但實(shí)際工作中,單元格內(nèi)存在的換行符,回車符這些無法打印字符是無法通過替換刪除的,如果這些字符沒有清理干凈,又會(huì)影響后續(xù)數(shù)據(jù)的處理和運(yùn)算,嚴(yán)重者,更影響數(shù)據(jù)的準(zhǔn)確與精度,所以在替換完之后,我們需要用left或right公式檢查一下單元格內(nèi)是否存在換行符或打印符;
4、對(duì)于不會(huì)vba的小伙伴來說,另一種方法是函數(shù)結(jié)合使用刪除空格與無法打印字符:
=CLEAN(SUBSTITUTE(C2," ","")),其中SUBSTITUTE(C2," ","")的作用是刪除單元格內(nèi)所有空格,CLEAN的作用是刪除單元格內(nèi)無法打印字符
5、對(duì)于多行多列的表格來說,要一列一列的輸入公式來進(jìn)行空格的清理,效率未免低下,為了提高效率,一次完成目標(biāo),可以使用VBA代碼一次完美解決這個(gè)問題,代碼如下:
Sub 刪除空格()
Dim arr, brr, crr, i, j
Application.ScreenUpdating = False '關(guān)閉屏幕更新
tm = Timer
arr = Sheets(1).UsedRange.Value '將第一個(gè)工作表的已用區(qū)域賦值給數(shù)組arr
ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2)) '定義數(shù)組brr的行數(shù)、列數(shù)
For i = 1 To UBound(arr) 'i的值為數(shù)組arr的第一維最大下標(biāo)(即第一個(gè)工作表已用區(qū)域的行數(shù))
For j = 1 To UBound(arr, 2) 'j的值為數(shù)組arr的第二維最大下標(biāo)(即第一個(gè)工作表已用區(qū)域的列數(shù))
a = Replace(arr(i, j), " ", "") '替換arr(i,j)的所有空格
brr(i, j) = Application.WorksheetFunction.Clean(a) '用工作表函數(shù)clean處理a,將a的所有非打印字符刪除除
Next j
Next i
With Sheets(2):
.UsedRange.Clear
.[A1].Resize(UBound(brr), UBound(brr, 2)) = brr '將數(shù)組brr輸入到sheet2的左上角為A1的單元格區(qū)域內(nèi)
End With
Application.ScreenUpdating = True '開啟屏幕更新
MsgBox "工作完成!用時(shí)" & Timer - tm & "秒", 64, "提示" '代碼運(yùn)行用時(shí)
End Sub
以上,即是vba實(shí)現(xiàn)刪除空格、非打印字符的vba代碼
5、在辦公現(xiàn)代化的今日,python的運(yùn)用越來越廣,那么,用python代碼應(yīng)該怎么處理這個(gè)問題呢?python代碼如下(需要用到的模塊為openpyxl,用pip方法即可安裝):
#_*_coding:utf-8_*_
from openpyxl import load_workbook
file = "五城網(wǎng)簽-200325.xlsx" #要處理的文件路徑
wb = load_workbook(file) #加載文件
ws = wb.active
for i in range(2, ws.max_row+1):
for j in range(3, ws.max_column+1):
old = str(ws.cell(i, j).value)
if old is not None:
ws.cell(i, j).value = old.strip().replace(' ', '').replace("\n", "")
if str(ws.cell(i, j).value)[0:7] =="_x000D_" or str(ws.cell(i, j).value)[-6:len(str(ws.cell(i, j).value))] == "_x000D_":
ws.cell(i, j).value = str(ws.cell(i, j).value)[7:len(str(ws.cell(i, j).value))-7]
elif str(ws.cell(i, j).value)[-7:len(str(ws.cell(i, j).value))] == "_x000D_":
ws.cell(i, j).value = str(ws.cell(i, j).value)[0:len(str(ws.cell(i, j).value)) - 7]
wb.save(file)
wb.close()
print("處理完成")
核心語句為:
ws.cell(i, j).value = old.strip().replace(' ', '').replace("\n", "")
主要作用是將單元格所有的空格,換行符替換為空,但是這一個(gè)語句的不足之處是無法將非打印字符刪除,一般情況下,這種非打印字符是回車、換行符,ASCII碼是10、13,讀者有興趣可以在單元格內(nèi)輸入=code(A1)這個(gè)公式測試一下非打印字符的ASCII碼,經(jīng)調(diào)試發(fā)現(xiàn),ASCII碼為10、13的字符在python里返回的字符形式為“x000D ”,所以替換掉空格之后,需要在后面加上兩句if判斷語句,將殘留的非打印字符繼續(xù)刪除:
if str(ws.cell(i, j).value)[0:7] =="_x000D_" or str(ws.cell(i, j).value)[-6:len(str(ws.cell(i, j).value))] == "_x000D_":
ws.cell(i, j).value = str(ws.cell(i, j).value)[7:len(str(ws.cell(i, j).value))-7]
elif str(ws.cell(i, j).value)[-7:len(str(ws.cell(i, j).value))] == "_x000D_":
ws.cell(i, j).value = str(ws.cell(i, j).value)[0:len(str(ws.cell(i, j).value)) - 7]