1. 在EXCEL中。用VBA程序編寫:
不知道你是不是要放在工作表的change事件來處理這件事.所謂工作表的change事件就是當工作表的單元格內容發生變化後觸發這個事件.並自動執行相關代碼.
這是我按你的要求寫的放在工作表change事件里的代碼 因為不知道迴文的位置 所以我假定迴文是在A列.yes no 輸出在B列同行的單元格.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 Then
Dim FXstr
FXstr = StrReverse(Target.Value)
If FXstr = Target.Value Then
Target.Offset(0, 1) = "YES!"
Else
Target.Offset(0, 1) = "NO!"
End If
End If
End Sub
如果要用宏手動執行用下面的代碼 ,假設迴文在A1單元格
Sub 檢查迴文()
Dim FXstr
FXstr = StrReverse(Range("A1").Value)
If FXstr = Range("A1").Value Then
Range("A1").Offset(0, 1) = "YES!"
Else
Range("A1").Offset(0, 1) = "NO!"
End If
End Sub
2. 請求大神幫忙寫個excel VBA代碼,謝謝!
法則碼如下:
一、開發工具
四、編寫代碼
Private Sub Worksheet_Change(ByVal Target As Range)
Dim FRG As Range
If Target.Column = 2 Then
Set FRG = Sheet2.Range("B:B").Find(Target)
If Not FRG Is Nothing Then
Sheet1.Range("B" & Target.Row) = Sheet2.Range("B" & FRG.Row)
Sheet1.Range("C" & Target.Row) = Sheet2.Range("C" & FRG.Row)
Sheet1.Range("D" & Target.Row) = Sheet2.Range("D" & FRG.Row)
孫臘哪 Sheet1.Range("E" & Target.Row) = Sheet2.Range("E" & FRG.Row)
Sheet1.Range("F" &局唯 Target.Row) = Sheet2.Range("F" & FRG.Row)
Sheet1.Range("G" & Target.Row) = Sheet2.Range("G" & FRG.Row)
Sheet1.Range("H" & Target.Row) = Sheet2.Range("H" & FRG.Row)
End If
End If
End Sub
五、在分類1中輸入金,後面數據自動出來
3. vba代碼怎麼編寫
在工作表事件(比如在sheet1)中添加以下代碼:
PrivateSubWorksheet_Change(ByValTargetAsRange)
IfTarget.Column=7Then
Cells(Target.Row,Target.Column+2).Select
ElseIfTarget.Column=9Then
Cells(Target.Row,Target.Column+2).Select
ElseIfTarget.Column=11Then
Cells(Target.Row+1,7).Select
EndIf
EndSub
4. vba生成vba代碼
VBProject:代碼操作代碼之常用語句
一、增加模塊
1.增加一個模塊,命名為「我的模塊」
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdMole).Name = "我的模塊"
系統常量vbext_ct_StdMole=1
2.增加一個類模塊,命名為「我的類」
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_ClassMole).Name = "我的類"
vbext_ct_ClassMole=2
3.增加一個窗體,命名為「我的窗體」
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm).Name = "我的窗體"
vbext_ct_MSForm=3
二、刪除模塊
1.刪除「模塊1」
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("模塊1")
2.刪除窗體「UserForm1」
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("UserForm1")
3.刪除類模塊「類1」
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("類1")
4.刪除所有的窗體
Sub RmvForms()
Dim vbCmp As VBComponent
For Each vbCmp In ThisWorkbook.VBProject.VBComponents
If vbCmp.Type = vbext_ct_MSForm Then ThisWorkbook.VBProject.VBComponents.Remove vbCmp
Next vbCmp
End Sub
相關:
工作表和ThisWorkbook的模塊類型為vbext_ct_Document=100
三、增加代碼
1.在「模塊1」中插入代碼
如果需要在「Sheet1」、「Thisworkbook」、或「Userform1」中操作,用只需將下面的「模塊1」換成相應的名稱即可。
方法1:
在模塊的開始增加代碼,增加的代碼放在公共聲明option,全局變數等後面。
Sub AddCode1()
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.AddFromString _
"sub aTest()" & Chr(10) & _
"msgbox ""Hello""" & Chr(10) & _
"end sub"
End Sub
方法2:
在模塊指定行處增加代碼,原代碼後移。增加代碼不理會和判斷插入處代碼的內容。當指定行大於最後一行行號時,在最後一行的後面插入。
Sub AddCode2()
With ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole
.InsertLines 1, "sub aTest()"
.InsertLines 2, "msgbox ""Hello"""
.InsertLines 3, "end sub"
End With
End Sub
相關語句:
(1)「模塊1」中代碼總行數:
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.CountOfLines
(2)「模塊1」中代碼公共聲明部分的行數:
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.CountOfDeclarationLines
(3)顯示「模塊1」中第1行起的3行代碼內容:
Sub ShowCodes()
Dim s$
s = ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.Lines(1, 3)
Debug.Print s
End Sub
(4)過程aTest的起始行數:
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.ProcBodyLine("aTest", vbext_pk_Proc)
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.ProcStartLine("aTest", 0)
系統常量vbext_pk_Proc=0
二者的區別是ProcBodyLine返回sub aTest或Function aTest所在的行號,如果sub前面有空行,ProcStartLine返回空行的行號。
(5)過程aTest的總行數:
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.ProcCountLines("aTest", vbext_pk_Proc)
2.建立事件過程
建立事件過程除了使用上面的代碼如下面的AddEventsCode1外,還可以使用CreateEventProc方法,如AddEventsCode2所示。
一般方法:
Sub AddEventsCode1()
ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeMole.AddFromString _
"Private Sub Workbook_Open()" & Chr(13) & _
"MsgBox ""Hello""" & Chr(13) & _
"End Sub"
End Sub
CreateEventProc方法:
Sub AddEventsCode2()
Dim i%
With ThisWorkbook.VBProject.VBComponents("Sheet1").CodeMole
i = .CreateEventProc("SelectionChange", "Worksheet") + 1
.InsertLines i, "Msgbox ""Hello"""
End With
End Sub
上面CreateEventProc的兩個參數建立的事件過程為Worksheet_SelectionChange,分別是下劃線兩邊的內容。
相關:
測試是否存在SelectionChange事件
下面函數測試模塊molname是否存在過程subname,如果存在,則返回起始行號,否則返回0。
debug.print hassub("Worksheet_SelectionChange","Sheet1")
Function HasSub(ByVal subname As String, ByVal molname As String) As Long
On Error Resume Next
Dim i&
i = ThisWorkbook.VBProject.VBComponents(molname).CodeMole.ProcBodyLine(subname, 0)
If Err.Number = 35 Then
Err.Clear
HasSub = 0
Else
HasSub = i
End If
End Function
如果存在,則返回起始行號,否則返回0。
四、刪除代碼
1.刪除Sheet1中第2行起的三行代碼:
如果只刪除1行代碼,第二個參數可省略。
Sub DelCodes()
ThisWorkbook.VBProject.VBComponents("Sheet1").CodeMole.DeleteLines 2, 3
End Sub
2.刪除「模塊1」的所有代碼:
Sub DelCodes()
With ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole
.DeleteLines 1, .CountOfLines
End With
End Sub
3.刪除過程aTest:
Sub DelCodes()
With ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole
.DeleteLines . ProcStartLine("aTest", 0), .ProcCountLines("aTest", 0)
End With
End Sub
4.將「模塊1」的第5行代碼替換為「x=3」
ThisWorkbook.VBProject.VBComponents("模塊1").CodeMole.ReplaceLine 5, "x=3"
五、引用項目
1.增加引用
ThisWorkbook.VBProject.References.AddFromFile "C:\Windows\System32\asctrls.ocx"
2.取消引用
ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References("ASControls")
這里ASControls是引用的名字,即後面的rf.Name。
3.顯示當前所有引用
Sub ShowRefs()
Dim rf As VBIDE.Reference
For Each rf In ThisWorkbook.VBProject.References
Debug.Print rf.Name, rf.FullPath
Next
End Sub
六、信任及密碼
上面所有操作都基於這樣的前題:
(1)EXCEL已設置:
工具(T)-宏(M)-安全性(M)-可靠發行商(T)-勾選了「信任對於VB項目的訪問(V)」
(2)工程沒有設置密碼
如果不能滿足它們中的任何一個,代碼運行就會出錯。因為微軟不希望我們對VBProject進行操作,我們無從知道這種操作的直接方法被藏到了什麼地方。幸運的是,微軟在關起正門的同時,還是為我們留了一道門:SendKeys。藉助於這道後門和「錯誤陷阱」,我們仍可以完成我們所要做的事。
下面給出繞開這兩道門的示意代碼,如果你要運行它們,請記得切回EXCEL主界面,而不是在VBE中直接運行。
1.信任對於VB項目的訪問
Sub SetAllowableVbe()
On Error Resume Next
Dim Chgset As Boolean
'陷阱測試,VBProject.Protection在這兒並無實際的意義
Debug.Print ThisWorkbook.VBProject.Protection
If Err.Number = 1004 Then
Err.Clear
Application.SendKeys "%TMS%T%V{ENTER}"
Chgset = True
DoEvents
End If
'要執行的操作....
'.....
'操作完成後還原操作前的狀態
If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"
End Sub
2.操作密碼工程
Sub AllowPass()
Dim pw$
pw = "Password"
If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then
Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 屬性(&E)...").Execute
Application.SendKeys pw & "{ENTER}{ENTER}"
DoEvents
End If
'要執行的操作….
End Sub
Protection屬性返回工程的受保護狀態,vbext_pp_locked(1)為受保護,vbext_pp_none(0)表示沒有保護。