小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

excel vba常見問題解答

 昵稱1904906 2010-06-26
excel vba常見問題
--------引用
 

001。用命令按扭打印一個sheet1中B2:M30區(qū)域中的內(nèi)容?
我想在Sheet2中制件一個命令按扭, 打印表Sheet1中的[B2:M30] 區(qū)域中的內(nèi)容?
解答:可以將打印區(qū)域設(shè)為b2:m30,然后打印,如:
sheets("sheet1").printarea="b2:m30"
sheets("sheet1").printout
隨手寫的,你可以試試看。最簡單的方法是:你先 錄制宏,在錄制宏過程中, 跑到頁面設(shè)置里面, 把打印范圍設(shè)置到你想要的范圍。
然后退出,停止錄制宏, 你就可以得到一些代碼!

002。能否對一列中的文字統(tǒng)一去掉最后一個字?這些文字不統(tǒng)一,有些字數(shù)多,有些字數(shù)少。如何處理?我用{"&-}不行
解答:=REPLACE(A1,LEN(A1),1," ")(在過渡列進行)

003.能否根據(jù)單元格數(shù)值自動標(biāo)記序號?
各位大佬,一工作表有兩列,“序號”及“金額”,能否將金額不等于0的行自動標(biāo)上序號呢?如無現(xiàn)成的函數(shù),應(yīng)怎樣設(shè)置?
解答:Dim xuhao As Integer
xuhao = 1
Range("b2").Select
Do While Selection <> ""
  If Selection <> 0 Then
  ActiveCell.Previous.Value = xuhao
  xuhao = xuhao + 1
  End If
  ActiveCell.Offset(1, 0).Range("a1").Select
Loop

004.求教自定義函數(shù)
查詢了一些自定義函數(shù)的例子都是單變量的。自定義函數(shù)能否建立“(As Range) As Interger”的函數(shù),應(yīng)該可以的,請各位大師賜教!請以“∑x2”為例,萬分感謝!(該用"For Each ...Next",就是還不知道如何引用Range中的每個值,請高手指點。)
解答:參數(shù)使用Range而函數(shù)值為Integer是可以的
用for each next循環(huán)思路也是對的,應(yīng)該這樣作:
dim rg as range
dim ivalue as integer
for each rg in 參數(shù)區(qū)域
ivalue=ivalue+rg.value
next
函數(shù)=ivalue
大概意思如此,但沒有加入防錯處理,你自己先試試看,有問題在問。
又問:試了一天,還是不行。
Public Function x2(rng As Range) As Integer
Dim rng As Range
Dim ivalue As Integer
For Each rng In rng.Range
ivalue = ivalue + rng.value ^ 2
Next
x2 = ivalue
End Function
還望您的幫助。
解答:Public Function SUMX2(rng As Range) As Integer
    '你的錯誤有幾項:
    '1.函數(shù)名不能使用單元格位址的形式,否則在工作表中引用函數(shù)產(chǎn)生歧義,excel以為你引用單元格
    '2.參數(shù)名與內(nèi)部變量名沖突,rng本來是定義參數(shù),在過程中不應(yīng)出現(xiàn)重名變量
    '3.rng已被定義為range對象變量,實際意義是一range引用,不能再用rng.Range引用,range的range屬性是什么呢,沒有吧
    '函數(shù)我已經(jīng)給你改了,基本能用
    Dim rg As Range
    Dim ivalue As Integer
        For Each rg In rng
            ivalue = ivalue + rg.value ^ 2
        Next
    SUMX2 = ivalue
End Function
結(jié)果:調(diào)試成功!,非常感謝!

005.判斷字符串的包含性
用什么命 令“abcdefg”是否包含“abc”?
解答:If VBA.InStr(1, "abcdefg", "abc") <> 0 Then MsgBox "包含"

006.利用背景實現(xiàn)套打的解決方案
利用背景套打主要在于數(shù)據(jù)打印位置的確定,關(guān)鍵就是要使圖片和實物之間的尺寸保持一致,這里我引入一個中間參照物—空白表(只有表格線的表)。具體操作以套打支票為例說明:
          (1)將支票掃描成圖片。
          (2)打印一個空白表,使其與支票尺寸一致(需反復(fù)調(diào)整打印,也可行、列分別打印)。
          (3)用“畫圖”的縮放功能調(diào)整圖片大小,導(dǎo)入excel作背景,并使其與空白表大小一致(亦需反復(fù)調(diào)整導(dǎo)入,每次均用原圖縮放,再另存為一個文件)。
          (4)根據(jù)圖片背景調(diào)整好單元格,填入數(shù)據(jù)后套打支票,效果是匹配度達99%。
          (5)由于每次都是用原圖縮放,故可取得縮放比例作為參數(shù),再套打其他表格時,即可直接依參數(shù)縮放圖片。
          思路:因為空白表=支票,圖片=空白表,所以圖片=支票。
          該方案已證實可行。

007.宏放在worksheet和sheet及模塊中各有什么區(qū)別?
解答:放在thisworkbook或sheet中的宏與模塊中的宏的主要區(qū)別是book或sheet中的過程函數(shù)只能是對象所專有的,不能在對象之外的任何地方調(diào)用(很顯然不能聲明Public過程,否則編譯報錯),而模塊中聲明Public過程函數(shù)可以在任何地方使用。

008.關(guān)于excel問題
在excel中如何用公式實現(xiàn)單元格內(nèi)容遞增?
如:    AB12
          AB13
          AB14
          .......
          AB100
條件是無法確定儲存格中的內(nèi)容的前面有多少個字符,也就是,可能是2個,也可能是3個,或者更多。
解答:為什麼要用公式呢?
如 A1 = AB12 ,只要你向下拉的複制就可以。

公式可參考 (條件是 AB12 不可以是 AB02, 處理 0 為首的數(shù)字 有困難,亦不可以只有英文字)
A1 = AB12
A2 = LEFT(A1,LEN(A1)-SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},"")))) & RIGHT(A1,SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))))+1
(A1 = AB12

公式
=LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))
答案看到的是 4 ,但其實它回傳一個數(shù)組 {4,3,3,4,4,4,4,4,4,4}

公式
=LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))
答案看到的是 0 ,但其實它回傳一個數(shù)組 {0,1,1,0,0,0,0,0,0,0}

公式
=SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},""))) 是將 {0,1,1,0,0,0,0,0,0,0} 加總
= 2)

009.給數(shù)組公式、VBA愛好者潑點冷水。
數(shù)組公式、VBA威力巨大,在某些情形下提高效率非常明顯,但各有其弱點。數(shù)組公式在大數(shù)據(jù)的時候,運行速度慢得無法忍受。比如,我日常需要編制得幾個報表,原始數(shù)據(jù)有4-8萬行,20——30列,用數(shù)組根本無法操作。倒是利用數(shù)據(jù)透視表及其他一些組合功能,可謂神速。而VBA主要適用與日常比較固定的一些工作,對于一些臨時性工作而言,缺乏靈活性,有殺雞用牛刀之嫌疑。因此,根據(jù)我個人多年工作經(jīng)驗的體會,能熟練地靈活運用EXCEL基本功能和常用函數(shù),就可以高效地完成大部分日常工作。
我比較常用地東西有:數(shù)據(jù)透視表,數(shù)據(jù)——有效性,ctrl+enter,index ,match,indirect,offset,if,vlookup,下拉列表框,絕對引用與相對引用,編輯——選擇性粘貼(數(shù)值、乘除、轉(zhuǎn)置等),圖表,條件格式,定義名稱,分列,填充等。
相反觀點:數(shù)據(jù)透視表的計算是excel中內(nèi)置的,同樣的計算次數(shù)速度與數(shù)組公式是一樣的,數(shù)組公式計算慢有兩個因素,一是公式的編寫不合理,另一個主要的原因是數(shù)組公式要對所有的引用數(shù)據(jù)進行計算,不管這些數(shù)據(jù)是否有效。
VBA應(yīng)該是最靈活的,在VBA中結(jié)合數(shù)組公式是可以達到最佳目的的,可用VBA先分析出數(shù)組公式要用的有效引用區(qū)域,在輔助表中進行數(shù)組計算(這個速度比用VBA直接分析計算要快得多),再將結(jié)果記入需要的單元格中,然后刪除輔助表。
其實你說的那些基本操作均可用VBA來做的,速度比手工做要快。


010.從式子抽取一小式子的問題?
b1=sum(a1:a10)+(10+20)/4,怎么從中取出(10+20)/4或其結(jié)果(即5)?用evaluate、get.cell都不能取出。
解答:定義X=get.formula($B$1)得到B1的公式,再用MID、Right等函數(shù)截取

011.or可以用數(shù)組應(yīng)用?
有一個工作表,數(shù)據(jù)上萬行,其中一列是我要分析的數(shù)值,數(shù)值比如為:0111,0112,0113,0114,0115,0116,0117中的任何一個。我要統(tǒng)計除0111,0113,0115之外的數(shù)據(jù)。公式:{sum(if(or(sheet!A2:A1111="0111",sheet!a2:a1111="0113",sheet!a2:a1111="0115"),1,0))},可是統(tǒng)計數(shù)字和我篩選相加的不一樣,用if層層選,可以。請問原因?
解答:數(shù)組公式中用*、+代替AND、OR
{sum(if((sheet!A2:A1111="0111")+(sheet!a2:a1111="0113")+(sheet!a2:a1111="0115"),1,0))}

012.countif表達式的格式
請問:我想找A1:A15中,值不為空的數(shù)目,用countif命令怎么寫呢?
解答1:應(yīng)為counta(a1:a15)。countif為找a1:a15中,特定值的數(shù)目。
解答2:=ROWS(A1:A15)*COLUMNS(A1:A15)-COUNTIF(A1:A15,"")
=ROWS(A1:A15)*COLUMNS(A1:A15)-COUNTBLANK(A1:A15)
解答3:直接用count(a1:a15)不是更好嗎!

013.刪除字符串中某個字符的函數(shù)是什么?刪除字符串中某個字符的函數(shù)是什么?
舉例:字符串“i love you a!"想刪除a字面,應(yīng)該用什么函數(shù)實現(xiàn)?還有就是在字符串中某個位置加入某個字符用什么函數(shù)呢?
解答:如果有一定的規(guī)律,可以用Replace函數(shù)。例如:在A1單元格已有的字符串”123467"中加入個5變?yōu)?#8220;1234567”??梢赃@樣做:=replace(a1,5,,"5")
另一方法:用CONCATENATE函數(shù)。
例如:a5單元格里的數(shù)據(jù)是“asdfhjkl",在另外的單元格了輸入下面的函數(shù)
CONCATENATE(LEFT(A5,4),"l",RIGHT(A5,4)),得到的結(jié)果就是”asdflhjkl",然后用“選擇性粘貼,粘貼數(shù)值”粘貼回a5單元格就可以了。

014.兩表合一實例
    問題提出:怎樣把兩個表(有相同的字段)怎樣合并成一個表?
     思路:用CountIf()函數(shù)對表1進行判斷,如果其值為0,則表示沒以重復(fù),再將表2中和表1不重復(fù)的數(shù)據(jù)復(fù)制到表1中,從而實現(xiàn)兩表合一。
解題的方法:
Sub dd()
b = Sheets(2).[a1].CurrentRegion.Rows.Count + 1
‘判斷表2的行數(shù)
For i = 3 To b
a = Sheets(1).[a1].CurrentRegion.Rows.Count + 1 
‘判斷表1的行數(shù)
c = Sheets(2).[a1].CurrentRegion.Columns.Count  
‘判斷表2的列數(shù)
If Application.WorksheetFunction.CountIf(Sheets(1).[b1:b1000], Sheets(2).Cells(i, 2)) = 0 Then
Sheets(2).Range(Sheets(2).Cells(i, 1), Sheets(2).Cells(i, c)).Copy Sheets(1).Cells(a, 1) 
‘將表2中與表1不重復(fù)的數(shù)據(jù)復(fù)制到表1中
End If
Next
End Sub

015.有沒有辦法把加載宏內(nèi)置到Excel文件里?
因為用了 Networkdays 函數(shù),用到了分析工具庫,但是還要發(fā)給別人,怎么辦?
解答:試試在"Thisworkbook"中寫如下語句:
Private Sub Workbook_Open()
    Application.RegisterXLL Filename:= _
        "Office安裝路徑\Office\Library\Analysis\ANALYS32.XLL"
End Sub
又問:Office安裝路徑怎么寫呀?大家不一定都裝在C盤上。
解答:試試:Application.Path & "\Library\Analysis\ANALYS32.XLL"

046.如何在userform上顯示最大化與最小化按鈕
解答:
利用API
Option Explicit
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_THICKFRAME As Long = &H40000     '(恢復(fù)大小)
Private Const WS_MINIMIZEBOX As Long = &H20000    '(最小化)
Private Const WS_MAXIMIZEBOX As Long = &H10000    '(最大化)

Private Sub UserForm_Initialize()
  Dim hWndForm As Long
  Dim IStyle As Long
  hWndForm = FindWindow("ThunderDFrame", Me.Caption)
  IStyle = GetWindowLong(hWndForm, GWL_STYLE)
  IStyle = IStyle Or WS_THICKFRAME  '還原
  IStyle = IStyle Or WS_MINIMIZEBOX '最小化
  IStyle = IStyle Or WS_MAXIMIZEBOX '最大化
  SetWindowLong hWndForm, GWL_STYLE, IStyle
End Sub

017.這個判斷代碼怎么寫
在A列輸入日期,如果所輸入日期為1月1日或5月1日則B列相關(guān)單元格+1,其他日期+0,這要用到什么函數(shù)?代碼怎么寫?謝謝!
解答:用IF函數(shù)或用Worksheet_Change事件
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 1 Then
        If IsDate(Target) Then
            If (Month(Target) = 1 And Day(Target) = 1) Or (Month(Target) = 5 And Day(Target) = 1) Then
                Target.Offset(0, 1) = Target.Offset(0, 1) + 1
            End If
        End If
    End If
End Sub

018.這個匯總表拆分程序怎么寫,高手幫忙!
要將總表里的數(shù)據(jù)按工作單位字段拆分成數(shù)個分表(每個單位一張表格,標(biāo)簽名字為工作單位)這個程序怎么編寫,請高手指點。如果記錄增多或字段增多(但拆分字段不增)這個程序又應(yīng)該怎樣改寫,請高手稍微講解一下,應(yīng)為我不是為這一個表,還想用到別的工作表中,謝謝!
解答:Sub Add_data(sht_Name)   '找出要取資料的區(qū)域
    Dim i As Integer, j As Integer, row_d As Integer
    Dim First_row As Integer, Last_row As Integer
    On Error Resume Next
    With Sheets("總表")
        i = 1
        Do Until .Cells(i, 3).value = sht_Name
            i = i + 1
        Loop
        First_row = i
       
        j = First_row
        Do Until .Cells(j, 3) <> sht_Name
            j = j + 1
        Loop
        Last_row = j - 1
    End With
    Sheets("總表").Range(Cells(First_row, 1), Cells(Last_row, 12)).Select
    Selection.Copy
    Sheets(sht_Name).Select
    Range("A2").Select
    ActiveSheet.Paste
    With ActiveSheet
        row_d = .Range("A2").End(xlDown).Row + 1
        Range("B" & row_d).value = "合計"
        For i = 5 To 11
            Cells(row_d, i).value = Application.WorksheetFunction.Sum(Range(Cells(2, i), Cells(row_d - 1, i)))
        Next i
    End With
   
    Sheets("總表").Activate
    Range("A2").Select
   
End Sub

020.這個公式應(yīng)該怎么寫?
我想統(tǒng)計所有物料編碼的第一個字符為a的庫存數(shù)量的總和,這個公式應(yīng)該怎么寫?A列為物料編碼,B列為庫存數(shù)量。
解答:=SUMIF($A:$A,"a*",$B:$B)


021.樣修改此宏?

下面的宏是k版主幫我寫的,從文件夾內(nèi)匯入其他工作表表格。匯入范圍為第五行、第L列。
如匯入范圍改為第三行、第R列。
怎樣修改此宏?

Public Sub Feed_in2()
Dim Row_dn, Row_dn1, i, j, k, m As Integer
Dim Path1, Str1 As String
Dim wb As Workbook
Row_dn = [B65536].End(xlUp).Row
Path1 = Application.ActiveWorkbook.Path
Str1 = ActiveWorkbook.Name
k = 5

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
        If Row_dn >= 5 Then
            Range("B5:L" & Row_dn).ClearContents
        End If
        With .FileSearch
            .NewSearch
            .LookIn = Path1
            .FileType = msoFileTypeExcelWorkbooks
            If .Execute <= 1 Then
                MsgBox "files no found": Exit Sub
            Else
                For m = 1 To .FoundFiles.Count
                    Str2 = Split(.FoundFiles(m), "\")
                    n1 = UBound(Str2)
                    Str2 = Str2(n1)
                    If Str2 <> Str1 Then
                        Set wb = Workbooks.Open((Path1 & "\" & Str2), True, True)
                        Row_dn1 = wb.Sheets(1).[B65536].End(xlUp).Row
                        For i = 5 To Row_dn1
                            For j = 2 To 12
                                Workbooks(Str1).Sheets(1).Cells(k, j) _
                                   = wb.Sheets(1).Cells(i, j)
                            Next j
                            k = k + 1
                        Next i
                        wb.Close False
                        Set wb = Nothing
                    End If
                Next m
            End If
        End With
        .EnableEvents = True
    End With
    End Sub
解答:除了B65536中的5,其余5都改成3;將Range("B5:L" & Row_dn)改成Range("B5:R" & Row_dn);將For j = 2 To 12改成For j = 2 To 17。

022.怎樣控制textbox的只讀,要使textbox中的數(shù)據(jù)不能改變(刪除或修改),在屬性里我沒有找到有相關(guān)的方法嗎?
解答:Textbox.Enabled = False,直接修改控件屬性都行。
又問:這樣還不行,因為Textbox在顯示上就灰顯了,我想只讓它不可改變值,在顯示上還是原來的形式。
解答:那就用Label代替,設(shè)置BackColor和SpecialEffect屬性。

023.請教個小問題!
你好:我錄制了個刪除工作表的宏,但每次運行后,總出現(xiàn)確認刪除提示框,請問該如何編寫,直接默認刪除,不在作確認呢?
解答:Application.DisplayAlerts = False
代碼為:Sub Dell()
     '
     '  Dell Macro
     '  DC.Direct 記錄的宏 2003-11-14
        Application.DisplayAlerts = False
        Sheets("Sheet2").Select
        ActiveWindow.SelectedSheets.Delete

        ActiveWorkbook.Save
        Application.DisplayAlerts = True
      End Sub

024.小知識:當(dāng)垂直滾動條滾動到無法顯示1-3行時,凍結(jié)窗口,1-3行就好像被隱藏了,但是取消隱藏也不行。

025.選A1后,自動顯示B1內(nèi)容,有無方法實現(xiàn)。有A1列和B1兩列,*D1處做了數(shù)據(jù)-有效性-序列-選擇A1~A9
*D1選擇A1時,要求在G1中自動跳出B1的內(nèi)容, 選A2時,自動跳出B2的內(nèi)容*余此類推。
解答:G1公式:=Vlookup(D1,A1:B9,2,0)
又問:假設(shè),有C列中也有數(shù)據(jù),我要在G1中顯示C列中的數(shù)據(jù),該怎么算?
解答:G1公式:=Vlookup(D1,A1:B9,3,0)

026. 向上填充的快捷鍵是什么?我只會向下填充的快捷鍵,向上-向左-向右的都是什么呢?
解答:向上-Alt+E,I,U。向左-Alt+E,I,L。向右-CTRL+R

027.下方單元格上移,包含該單元格的公式不要變化
哪位高手幫幫忙!我試驗了很久也沒找到解決的辦法:
能不能做到刪除單元格以后,下方單元格上移,包含該單元格的公式不要變化?;蛘呤牵喊醋hift拖動單元格,使兩個單元格互相交換位置以后,包含該單元格的公式不要發(fā)生變化。注意,用加$的辦法是不能解決這個問題的,如公式改為:=SUM($A$1:$A$9),經(jīng)上述操作后,結(jié)果還是一樣。
解答:=SUM(INDIRECT("A1:A10"))
新問題:但是還有一個問題:我這一列有2000多個數(shù)據(jù),似乎不能通過拖動的辦法將公式復(fù)制200遍,達到每10個1求和的結(jié)果。
解答:=IF(MOD(ROW(),10)<>0,"",SUM(OFFSET(INDIRECT(ADDRESS(ROW(),COLUMN(),)),,-1,-10,)))

028.一列中刪除重復(fù)數(shù)據(jù)的方法
例如在C2:C500中有重復(fù)數(shù)據(jù)。在D2中 =COUNTIF(C2:$C$100,C2) 計算出 C2在此列中的出現(xiàn)次數(shù),然后復(fù)制公式到整列,最后刪除在D列中大于1的行即可.

029.哪為大俠來幫忙關(guān)于VBA的問題
小弟想同時對excel工作簿下的幾個工作表進行插入圖表的操作!這幾個工作表中已經(jīng)在相同的位置區(qū)域內(nèi)輸入了數(shù)據(jù). 語言如下: 運行顯示 "下表越界" (下劃線的地方)。請問高手又什么辦法解決,或者可以用其它的方法。
sub biaoge()
for a = 1 to 3
sheets("sheet(a)").select
    charts.add
    activechart.applycustomtype charttype:=xlbuiltin, typename:="兩軸線-柱圖"
  activechart.setsourcedata source:=sheets("sheet (a)").range("a1:j3"), plotby:=xlrows   
activechart.location where:=xllocationasobject, name:="sheet(a)"       activechart.hasdatatable = true
    activechart.datatable.showlegendkey = true
    activechart.legend.select
    selection.delete
 next a
end sub
解答:sheets("sheet(a)").select是錯的??梢杂胹heets("Sheet_Name").select。

029.比較大小
例如512.03,我用函數(shù)取了這個數(shù)的最后兩個數(shù)03用他與10比較,結(jié)果總是顯示03>10,不知道是什么原因,請高手指點,謝謝!!!
解答:取后兩位數(shù)結(jié)果是文本型,對比可用right(a1,2)*1>10或者用:value(right(a1,2))>10也可

030.討論:用RANGE和CELLS選擇單元格
EXCEL的基本元素就是單元格,第一步就是要學(xué)會操作單元格了,列舉兩種方式。
SUB RANGE() ‘用RANGE選擇B5單元格
 RANGE(“B5”).SELECT
END SUB
SUB CELLS() ‘用CELLS選擇B5單元格
 CELLS(5,2).SELECT
END SUB
RANGE編程時無法變化,CELLS可以通過變量選擇單元格。
回應(yīng)1:RANGE 一樣方便, 甚至更方便. 實際使用中可以用一變量
srArea="B" & i
RANGE(srArea).SELECT
srArea="金額" ' 一命名為 金額 的單元格/區(qū)域
RANGE(srArea).SELECT
回應(yīng)2:我覺得各有長處,如果有變量需要循環(huán)判斷,用Cells相對比較簡單,但是有時候固定區(qū)域的,命名后用Range更靈活。
回應(yīng)3:沒錯. 幫助中也是推薦 CELL 的.
靈活性來講, RANGE 要強多了, 而且使用時可以通過 . 提取符快速讀取它的屬性和方法.
另外, 對于可變更的工作表, 用 RANGE 來操作命名區(qū)域?qū)⒃黾映绦虻膹椥?
比如工作中插入一行/列, VBA 中用 CELL 就可能導(dǎo)致運行操作錯誤, 而 RANGE(srArea) 作為指定區(qū)域, 可適應(yīng)單元格的這類變更.


031.關(guān)于FileSystemObject的引用
請問各路高手,有人可以為我指點一下filesystemobject引用的詳細說明,特別是fileexists方法的實例。
  解答:Sub testing()
   
    '先判斷文件是否存在,是則刪除之
   
    Dim strmyfile As String
    strmyfile = "d:\book1.xls"
    If filetoFind(strmyfile) Then
        Kill strmyfile
    End If
   
End Sub

Function filetoFind(fileName As String) As Boolean
    Dim fsobj As Object
    Set fsobj = CreateObject("Scripting.FileSystemObject")
    If fsobj.fileexists(fileName) Then
        filetoFind = True
    End If
End Function
在幫助文件中是這樣描述的:FileSystemObject 對象  
描述:提供對計算機文件系統(tǒng)的訪問。
語法:Scripting.FileSystemObject
說明:下面的代碼舉例說明了如何使用 FileSystemObject 返回一個 TextStream 對象,該對象是可讀并可寫的:
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:\testfile.txt", True)
a.WriteLine("This is a test.")
a.Close
在上面列出的代碼中,CreateObject 函數(shù)返回 FileSystemObject (fs)。CreateTextFile 方法接著創(chuàng)建文件作為一個 TextStream 對象(a),而 WriteLine 方法則向創(chuàng)建的文本文件中寫入一行文本。Close 方法刷新緩沖區(qū)并關(guān)閉文件。
FileExists 方法
描述:如果指定的文件存在,返回 True,若不存在,則返回 False。
語法:object.FileExists(filespec)
FileExists 方法語法有如下幾部分:
部分 描述:object 必需的。始終是一個 FileSystemObject 的名字。
filespec 必需的。要確定是否存在的文件的名字。如果認為文件不在當(dāng)前文件夾中,必須提供一個完整的路徑說明(絕對的或相對的)。

032.excel時間函數(shù)2(菜鳥教程)
這一貼說明時間函數(shù),time,hour,minute,second的用法。
time的計算過程:
time(hour,minute,second),time地返回值為0-0.99999999之間的數(shù)值,它的計算方法如下:
hour的范圍:0-24
minute的范圍:0-59
second的范圍:0-59
在滿足以上輸入范圍的時候:time(hour,minute,second)=hour/24+minute/(24*60)+second/(24*60*60)。如:tiem(05,34,29)=0.232280092592593.如何計算的呢?
5/24+34/(24*60)+29/(24*60*60)=0.208333333333333+0.0236111111111111
+0.000335648148148148=0.232280092592593。
在幫助文件里還有hour,minute,second不再范圍情況,這時候,如何計算的呢?
1、second/60,除的整數(shù)為minute,mod(second,60)為second
2、minute/60,除的整數(shù)為hour,mod(minute,60)為minute
3、hour/24,mod(hour,24)為hour
最后再用hour/24+minute/(24*60)+second/(24*60*60)計算。
幫助中的例子:time(0,0,2000)=0.023148如何算的呢?
2000/60=33   mod(2000,60)=20
time(0,0,2000)=time(0,33,20)=0/24+33/(24*60)=20/(24*60*60)=0.023148
呵呵,其實沒有什么用,會用這個函數(shù)就可以可,如何算的就不必在意了!!!

033.年月日的問題
    EXCEL表格中年月有時候輸入不對,(早已記錄過大量數(shù)據(jù),改寫麻煩。)比如198001,意思是1980年1月,可是設(shè)置單元格式日期只有年月日,沒有年月。怎么做?
解答:插入一輔助列,假設(shè)198001在E1,F(xiàn)=IF(MID(E1,5,1)="0",LEFT(E1,4)&"年"&RIGHT(E1,1)&"月",LEFT(E1,4)&"年"&RIGHT(E1,2)&"月")
試一下。
又問:198001能否改為1980-1?或者1980年1月改為1980-1?
解答:f1=IF(MID(e1,5,1)="0",LEFT(e1,4)&"-"&RIGHT(e1,1),LEFT(e1,4)&"-"&RIGHT(e1,2))
或者更簡單一些:=LEFT(A6,4)&"-"&value(RIGHT(A6,2))(數(shù)據(jù)在a6單元格)
也可以這樣:=date(mid(e1,1,4),mdi(e1,5,2),1)這樣會顯示為1980-1-1,然后可以隨意設(shè)置成相應(yīng)的日期格式。

034.請幫忙解釋一個公式
=LEFT(A1,(SEARCHB("?",A1)-1)/2)這是我在站內(nèi)過去的帖子里看到的一個公式,用于提取前文后數(shù)中的文字部分,非常好用。請教這個公式中最后兩步的意義是什么?另外,當(dāng)A1是“1234個”的格式時,當(dāng)如何提取其中的文字呢?
解答:1、公式的含義是:查找第一個半角字符出現(xiàn)的位置[SEARCHB("?",A1)],減去1后除以2,就是文字的字符數(shù)目,將其提取出來。
2、=RIGHT(A1,LENB(A1)-LEN(A1))

035.關(guān)于宏和程序
我現(xiàn)在已經(jīng)用excel編了一個較完整的程序,并且能夠給源程序加密碼,實現(xiàn)"工程不可見",但是我發(fā)現(xiàn)在vba編輯環(huán)境 里還能看到我的大部分宏,雖然說不能編輯,但能運行,請問如何隱藏起來。
解答:不用模塊函數(shù),重寫成類或放到workbook中,或在程序中直接將菜單宏隱藏?;蛘撸盒陆悾缓髮⒛K中的程序拷貝到類,提示:找不到宏。
又問:我現(xiàn)在已經(jīng)能做到屏蔽調(diào)alt+F11鍵了,雖然不能看到我的宏程序,但是依然可以運行我的宏,請高手做答,如何隱藏起我的宏。
解答:在宏的聲明前加Private。

036.請教多條件求和的問題
大家好,我是個新手,想向大家請教指定多條件求和的函數(shù)公式。
譬如,有一張工作表有4列標(biāo)題:品名,數(shù)量,日期,簽收人。
若我想求,符合條件為:品名為A,日期為Y,簽收人為B的數(shù)量之和。
該用那個函數(shù)公式?
解答:=IF(A2="a",IF(B2="03.10.22",COUNTIF(D:D,D2),"時間無"),"無")
A列品名,B列日期,C列數(shù)量,D列簽收人用if 嵌套。
或者:數(shù)組公式
{=sum((a1:a100=品名)*(c1:c100=日期)(d1:d100=簽收人)*(B1:B100))}
也可以:{=SUM((($A$1:$A$100)="a")*(($B$1:$B$100)="03.10.22"))}

037.請教關(guān)于星期的計算?
如何通過輸入一個日期:2003-10-20即可得到該天在本年度的第幾個星期?
解答:使用 WEEKNUM 函數(shù)。
如:=WEEKNUM(A1)
=WEEKNUM(TODAY())
或者:日期在a1
=INT((A1-DATE(YEAR(A1),1,0)+WEEKDAY(DATE(YEAR(A1),1,0),1)+7-WEEKDAY(A1,1))/7)
也可以用VBA:
'under the iso standard, a week always begins on a monday, and ends on a sunday.
'the first week of a year is that week which contains the first thursday of the year,
'or, equivalently, contains jan-4.
'
public function isoweeknum(anydate as date, _
     optional whichformat as variant) as integer
'
' whichformat: missing or <> 2 then returns week number,
'              = 2 then yyww
'
    dim thisyear as integer
    dim previousyearstart as date
    dim thisyearstart as date
    dim nextyearstart as date
    dim yearnum as integer

    thisyear = year(anydate)
    thisyearstart = yearstart(thisyear)
    previousyearstart = yearstart(thisyear - 1)
    nextyearstart = yearstart(thisyear + 1)
    select case anydate
        case is >= nextyearstart
            isoweeknum = (anydate - nextyearstart) \ 7 + 1
            yearnum = year(anydate) + 1
        case is < thisyearstart
            isoweeknum = (anydate - previousyearstart) \ 7 + 1
            yearnum = year(anydate) - 1
        case else
            isoweeknum = (anydate - thisyearstart) \ 7 + 1
            yearnum = year(anydate)
    end select
    if ismissing(whichformat) then
        exit function
    end if
    if whichformat = 2 then
        isoweeknum = cint(format(right(yearnum, 2), "00") & _
        format(isoweeknum, "00"))
    end if
end function

public function yearstart(whichyear as integer) as date
dim weekday as integer
dim newyear as date

newyear = dateserial(whichyear, 1, 1)
weekday = (newyear - 2) mod 7
if weekday < 4 then
    yearstart = newyear - weekday
else
    yearstart = newyear - weekday + 7
end if
end function

038.請教日期的轉(zhuǎn)換問題
我的程序里有這樣一段代碼:
Dim str As Date
str=now
Sheet1.Cells(1, "A") = str
運行后在單元格里顯示
2003/11/13  15:19:45
但我想讓它顯示成如下的格式:
2003年11月13日(小時,分,秒去掉)
我用year(str)想單獨取得年的值,但顯示1905/06/25  0:00:00
請問有什么好的方法可以實現(xiàn)這種轉(zhuǎn)換嗎?
解答:
Dim str As Date
str=now
Sheet1.Cells(1, "A") = format(str,"yyyy年mm月dd日")

039.如何用vba實現(xiàn)刪除最右邊的字符
1月、2月、3月...........10月、11月、12月
請問如何用vba實現(xiàn)把“月”刪除 只提取:1、2、3.......10、11、12。
解答:Sub abc()
Dim a As Integer
Dim b As String
Dim c As String
c = ""
For a = 1 To Len(b)
    c = c & IIf(Mid(b, a, 1) <> "月", Mid(b, a, 1), "")
Next
MsgBox c
End Sub
或者:
A1= 1月、2月、3月、4月、5月、6月、7月、8月、9月、10月、11月、12月
[A1] = Application.WorksheetFunction.Substitute([A1], "月", "")

040.請問如何定義相對定位的名稱
我想定義一個各個工作表(一個工作薄內(nèi))使用的名稱。該名稱為相對定位,
如我在sheet1表的B2中該名稱是 sheet1 表的A2,我在sheet2表的B2中時該名稱是sheet2表的A2單元格,可我在定義名稱時它總是加上工作表名。
解答:=offset(indirect(address(row(),column(),)),,-1,,)

041.請問如何替換?
有很多條這樣的記錄:******(212),****(315),*********(658)。如何只保留括號里的數(shù)字,*號是漢字。
解答:設(shè)數(shù)據(jù)在A30單元格 =MID(A30,FIND("(",A30)+1,LEN(A30)-FIND("(",A30)-1)
IF 你的數(shù)據(jù)都是要求記錄中最后面的三碼數(shù)字
可以試著用簡單的方式解決 
=RIGHT(A1,3)
又問:我是要合并,你卻要拆分!你能告訴我怎樣將兩列:即“數(shù)字列”和“文字列”合并成一列?
解答:試試這個:
Sub Join() '將選擇的行幾個單元格數(shù)值合并到一列的一個單元格
  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual
  On Error Resume Next
  Dim iRows As Long, mRow As Long, ir As Long, ic As Long
  iRows = Selection.Rows.Count
  Set lastcell = Cells.SpecialCells(xlLastCell)
  mRow = lastcell.Row
  If mRow < iRows Then iRows = mRow 'not best but better than nothing
  iCols = Selection.Columns.Count
  For ir = 1 To iRows
     newcell = Trim(Selection.Item(ir, 1).value)
     For ic = 2 To iCols
       trimmed = Trim(Selection.Item(ir, ic).value)
       If Len(trimmed) <> 0 Then newcell = newcell & " " & trimmed
       Selection.Item(ir, ic) = ""
     Next ic
     Selection.Item(ir, 1).value = newcell
  Next ir
  Application.Calculation = xlCalculationAutomatic
  Application.ScreenUpdating = True
End Sub

042.求教合并單元格區(qū)域的連續(xù)讀取方法
求教:1、如何選定連續(xù)的合并單元格區(qū)域;2、如何連續(xù)讀取合并單元格中的內(nèi)容。
解答:Public Sub adre()
Dim cell As Range
Dim iRow_dn1 As Integer
iRow_dn1 = [B65536].End(xlUp).Row
Set av1 = Range("B3:B" & iRow_dn1)
    For Each cell In av1
            If cell <> "" Then
            MsgBox cell.Address & " 等於 " & " ※ " & cell & " §"
        End If       
    Next   
End Sub

043.求一公式
sheet1                                             sheet2
            A              B            C                   A             B                 C
1      產(chǎn)品代碼    產(chǎn)品名     生產(chǎn)機器名       產(chǎn)品代碼    產(chǎn)品名     生產(chǎn)機器名
2      012354      a203         1m爐             225894       nj033              ?
3      214345      b4032       發(fā)泡爐           056894       kkl001             ?        
4      225894      nj033        1m爐             214345       b4032             ?
5      056894      kkl001        發(fā)泡爐                 
6      124589      lli002         1m爐            

SHEET1是一張源資料表,而SHEET2是一個生產(chǎn)計劃表的一部分。
請問:
        我求SHEET2中的A列中產(chǎn)品代碼相對應(yīng)的C列的”生產(chǎn)機器名“。
        這個公式怎么寫?
解答:Sheet2的C2格公式為:=VLOOKUP($A2,SHEET1!A:C,3,0)

044.討論一下取最后一個單詞的方法
例如現(xiàn)在在A1中有一句“M. Henry Jackey”,如何用函數(shù)將最后的一個單詞取出來呢? 當(dāng)然,我們現(xiàn)在是知道最后的單詞是6個字符,可以用Right(A1,6)來計算,但如果最后一個單詞的字符數(shù)是不定的呢,如果做呢? 請大家試下有幾種方法。
解答:方法1、用一列公式填充
=IF(LEFT(RIGHT($A$1,ROW()),1)=CHAR(32),RIGHT($A$1,ROW()-1),“”)
方法2、=MID(A1,FIND("       *",SUBSTITUTE(A1," ","       *",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1)-FIND(" ",A1))
方法3、用自定義函數(shù)當(dāng)然方便,而且簡單。
Function xx(n As String) As String
    n = Application.Trim(n)
    lastone = Right(n, Len(n) - InStrRev(n, " "))
    xx = lastone
End Function
方法4、=IF(ISERROR(SEARCH("",TRIM(LEFT(B1)))),RIGHT($A$1,ROW()),"")拖出來的第一個字符就行。
方法5、{=RIGHT(A1,LEN(A1)-MAX((MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)=" ")*ROW(INDIRECT("1:"&LEN(A1)))))}
嫌長就(假定最長100字符)
{=RIGHT(A1,LEN(A1)-MAX((MID(A1,ROW(1:100),1)=" ")*ROW(1:100)))}

045.如何獲取工作表中某一列有多少條記錄?
因為每一列的的記錄都不一樣多,所以我想獲得每一列各有多少條記錄,怎么做?
解答:RecordNumbers=Application.COUNTA(A:A)
或者:Private Sub UserForm_Activate()
x = Sheet1.UsedRange.Rows.Count
x1 = Sheet1.CountA(c4, cx)
也可以:Sub aa()
  MsgBox (Application.CountA(Range("A:A")))
End Sub
還可以:Sub aa()
x = Sheet1.UsedRange.Rows.Count
MsgBox (Application.CountA(Range("c3:cx")))
End Sub
這樣也行:用下面的方法可測出任一列使用的行數(shù)
a=Sheet1.range("b1").End(xlDown).Row。
總結(jié):
1.Sub aa()
  MsgBox (Application.CountA(Range("C:C")))
End Sub
結(jié)果永遠都是1或者3,可是實際上記錄有600多條
2.
Sub aa()
Worksheets("sheet1").Activate
    Range("c2").Select
    x1 = "=COUNTA(sheet1!C)"
    MsgBox x1
End Sub
這個是看fhj 示例的文件錄制成宏改的,不過運行結(jié)果永遠是 =counta(sheet1!c)
3.
Sub aa()
    x1 = "=COUNTA(sheet1!C)"
    MsgBox x1
end sub
提示和前面的一樣。
4.其實已經(jīng)試了幾十種方法了。還是錯的。作為公式時,是可以使用。但是卻
無法把獲得的值賦值給一個變量。除非是先寫到一個單元格里,再重新讀出來。
不過我覺得太麻煩了。而且寫的時候會修改工作表。不是很恰當(dāng)。

解答:Application.CountA(Range("C:C"))返回除去無值單元格的所有單元格的數(shù)量。
Sheet1.range("C1").End(xlDown).Row返回第一次遇到空單元格前的單元格的數(shù)量。
(注:當(dāng)C列有空白單元格時用:
myEndRow=sheets("sheet1").range("C65536").End(xlUp).row)
結(jié)論:Sub aa()
x1 = Sheet1.Range("C3").End(xlDown).Row
    MsgBox x1
end sub
這就對了。謝謝各位!
回應(yīng):推薦你用
 Columns(1).SpecialCells(xlCellTypeConstants).Count


045.如何禁止輸入空格
在Excel中如何通過編輯“有效數(shù)據(jù)”來禁止錄入空格?煩請大俠們費心解答。不勝感激。
解答:有效性公式。=COUNTIF(A1,"* *")=0
(注:COUNTIF(A1,"* *") 在單元格有空格時結(jié)果為1,沒有空格時結(jié)果為0
如希望第一位不能輸入空格:countif(a1," *")=0
如希望最后一位不能輸入空格:countif(a1,"* ")=0)

046.如何判斷單元格中單詞的數(shù)量?
比如我在A1中輸入“you are a good boy”如何判斷單詞為5個?
解答:=LEN(E12)-LEN(SUBSTITUTE(E12," ",""))+1
(注:方法很巧妙 用trim把前后的空格去掉。如果有標(biāo)點符號或者兩個詞之間的空格數(shù)大于1個就不好辦了)

047.如何取數(shù)
表一有數(shù)據(jù),要求表二中數(shù)據(jù)為取一行表一數(shù)據(jù),空一行。
解答:
Sub test()
On Error Resume Next
Application.ScreenUpdating = False
For i = 1 To Sheets(1).UsedRange.Rows.Count
  Sheets(1).Rows(VBA.Trim(VBA.Str(i)) + ":" + VBA.Trim(VBA.Str(i))).Copy
  Sheets(2).Activate
  Sheets(2).Rows(VBA.Trim(VBA.Str(i * 2 - 1)) + ":" + VBA.Trim(VBA.Str(i * 2 - 1))).Select
  ActiveSheet.Paste
Next i
Application.ScreenUpdating = True
End Sub

048.如何通過VBA編程將符合條件的數(shù)據(jù)庫記錄輸入到EXCEL中
現(xiàn)在有access格式的數(shù)據(jù)表 TEST

貨號                   貨名                    規(guī)格                  單價....

1-01                 貨品1                   1M                  250.00

1-02                 貨品2                   4Kg                 100.00

................

N-99               貨品N                   999                 999.99

現(xiàn)在我想在EXCEL的單元格中輸入貨號,通過VBA代碼自動從數(shù)據(jù)表中查找出相應(yīng)的記錄,并在相鄰的列分別自動錄入貨品、規(guī)格、單價等內(nèi)容,從而實現(xiàn)EXCEL自動數(shù)據(jù)錄入。請問這VBA代碼應(yīng)如何寫?謝謝!

解答:Private Sub Worksheet_Change(ByVal Target As Range)
Dim Rs As New ADODB.Recordset
Dim Query As String
Dim Cnn As String
With Application
    .ScreenUpdating = False
    .EnableEvents = False
End With
Cnn = "Driver=Microsoft Access Driver (*.mdb);DBQ=C:\*.mdb"
Query = "SELECT * FROM TEXT WHERE 貨號='" & Target & "'"
With Rs
    .Open Query, Cnn, adOpenStatic, adLockReadOnly
    If .RecordCount = 0 Then
    MsgBox "沒有此貨號!"
         Target.ClearContents
    Else
        Target.CopyFromRecordset Rs
    End If
   .Close
End With
With Application
    .ScreenUpdating = True
    .EnableEvents = True
End With
End Sub

049.如何統(tǒng)計一個單元格中的數(shù)字有幾位數(shù)?
解答1:=LEN(單元格地址)
又問:如果中間有漢字或者是字母、符號呢,或是數(shù)者都有呢?
解答2:=SUM(LEN(A1)-LEN(SUBSTITUTE(A1,{"0","1","2","3","4","5","6","7","8","9"},"")))
解答3:=2*LEN(A1)-LENB(A1)
(備注:對 中文 + 數(shù)字 是很好的做法,但有英文字 或 中文 + 數(shù)字 + 英文 就出錯)

050.如何選取列內(nèi)不重複資料
解答1:Sub ff()
Dim aa As New Collection
cc = 2
On Error Resume Next
Do Until Cells(3, cc) = ""
   aa.Add Cells(3, cc).value, Cells(3, cc).Text
   cc = cc + 1
Loop
On Error GoTo 0
cc = 2
For Each itm In aa
   Cells(5, cc) = itm
   cc = cc + 1
Next
End Sub
解答2:提供一個以陣列方法為思考模式的方法
Sub ff()
On Error Resume Next
   cc = 2
   Set NoDupes = CreateObject("Scripting.Dictionary")
   Do Until Cells(3, cc) = ""
           NoDupes.Add Cells(3, cc).value, Cells(3, cc).value
       cc = cc + 1
   Loop
   Range("B6").Resize(1, UBound(NoDupes.keys) + 1) = NoDupes.keys        '陣列由0開始,所以+1
End Sub
 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多