Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 29

0
votes
answers
7 views
+10

列出所有不同的分佈選項VBA

-2

我有一個Excel行,看起來像這樣:列出所有不同的分佈選項VBA

0.0 0.0 0.0 0.0 0.0 1.0 

,每個值都是一個單元。我想要的是以0.1的步驟列出所有不同的分配選項。該行的總和邏輯始終爲1 所以結果應該是這個樣子:

0.0 0.0 0.0 0.0 0.1 0.9 
0.0 0.0 0.0 0.0 0.2 0.8 
0.0 0.0 0.0 0.0 0.3 0.7 
... 
0.0 0.0 0.0 0.1 0.1 0.8 
0.0 0.0 0.1 0.0 0.1 0.8 
0.0 0.1 0.0 0.0 0.1 0.8 
... 

結果將包含數百行。我不知道如何編程這個算法。 感謝您的每一個解決方案!

+0

什麼是最後一行的基礎相對於其前任顯示? – pnuts

+0

@pnuts列表如何顯示並不重要。最主要的是最終所有的可能性都應該列出來。 – InformatikBabo

+2

對我來說,你需要更多的列來完成「每個組合」 - 比如10. –

沙发
0
2

考慮:

Sub whatever() 
Dim K As Long 
K = 1 
For i1 = 0 To 1 Step 0.1 
    For i2 = 0 To 1 Step 0.1 
     For i3 = 0 To 1 Step 0.1 
      For i4 = 0 To 1 Step 0.1 
       For i5 = 0 To 1 Step 0.1 
        For i6 = 0 To 1 Step 0.1 
         If Abs(i1 + i2 + i3 + i4 + i5 + i6 - 1) < 0.001 Then 
          Cells(K, 1) = i1 
          Cells(K, 2) = i2 
          Cells(K, 3) = i3 
          Cells(K, 4) = i4 
          Cells(K, 5) = i5 
          Cells(K, 6) = i6 
          K = K + 1 
         End If 
        Next 
       Next 
      Next 
     Next 
    Next 
Next 
MsgBox K 
End Sub 

enter image description here

+0

我建議在每個級別都放上If語句,但是有不到200萬次的迭代,所以這可能不值得。 – YowE3K

+1

@ YowE3K它運行速度相當快,因爲??只有大約3000個工作表「觸摸」 –

+0

是的,正如我所說的,不值得付出努力。如果OP想要使用大於1的數字作爲總數,或者想要使用更多的列來表示更多的組合,那麼如果它們能夠產生潛在的答案,那麼僅僅進行循環可能是值得的 - 但是,如目前所問,只有11^6個組合才能檢查(這在內存中沒有時間),只有很少數量的寫入意味着這個答案能很好地完成這項工作。 – YowE3K

0
votes
answers
6 views
+10

運行時錯誤6069

0

你好傢伙我有爲我打開的循環內聯形狀(doc文件附加的xlsx文件)。它工作正常,但有時我得到一個錯誤:運行時錯誤6069

Run-time error 6069

它會通知我嘗試打開Excel應用程序,也許它沒有安裝(WOW)。

當我調試它突出了一個車道

wddoc.InlineShapes(lShapeCnt).OLEFormat.Activate 

我按下「運行」,它正常工作,就像沒有錯誤。 但這是令人沮喪的,因爲我需要干預和誰將使用此工具的用戶不能這樣做。

沙发
0
0

這可能是一些超時問題。您可能會嘗試重複一段時間的操作:

... 
timeout = Now + #00:00:01# 'Try for 1 second max 
On Error Resume Next 
Do 
    Err.Clear 
    wddoc.InlineShapes(lShapeCnt).OLEFormat.Activate 
    Doevents 'Sometimes you need to allow events to succeed in some methods 
Loop While Err.Number=0 Or Now>timeout 
If Err.Number <> 0 Then 
    MsgBox "Coudn't make call..." 
    Err.Raise Err.Number 
End If 
On Error GoTo 0 'or whatever error handler you were using 
... 
0
votes
answers
6 views
+10

如何通過宏在單元格中粘貼公式?

0

我想通過VBA在Excel單元格中粘貼公式,但沒有運氣。 當我嘗試這種代碼,它完美的作品 -如何通過宏在單元格中粘貼公式?

ActiveSheet.Range("B7").Value = "=VLOOKUP(A7,$A$1:$B$3,2,0)"

但是當我嘗試這種代碼

ActiveSheet.Range("B7").Value = "=VLOOKUP(CONCATENATE(VLOOKUP(LOOKUP(2,1/($A$5:A7<>""),$A$5:A7),Instructions!$A$4:$B$40,2,0),NTFS!XFC7-2),'Trial Balance'!$I$55:$J$1048576,2,0)"

它與錯誤1004運行時錯誤結束 - 應用程序定義或對象定義的錯誤。

我只是希望公式粘貼到細胞中的任何其他代碼會工作。請幫助我解釋發生此錯誤的原因,並要求您提供一個破解或替代方法來粘貼公式。

在此先感謝!

+0

更改'「」'是'「」「」' – YowE3K

+0

確切位置在哪裏,有這麼多的時候,我已經使用他們? @ YowE3K –

+0

該公式中只有一個'''' - 部分說'$ A $ 5:A7 <>「」' – YowE3K

沙发
0
-1

嘗試:

ActiveSheet.Range("B7").FormulaR1C1 = "=VLOOKUP(CONCATENATE(VLOOKUP(LOOKUP(2,1/($A$5:A7<>""),$A$5:A7),Instructions!$A$4:$B$40,2,0),NTFS!XFC7-2),'Trial Balance'!$I$55:$J$1048576,2,0)" 
+1

需要在四倍引號中間'A7 <>「」「」' – ashleedawg

+0

FormulaR1C1使用具有罕見類型單元格引用的,是這樣的:範圍(「D4」)。FormulaR1C1 =「= R [-1 ] C [-2] * 10" – z32a7ul

+0

感謝的人!這個事情的作品! –

板凳
0
0

嘗試這種情況:

ActiveSheet.Range("B7").Formula = "=VLOOKUP(CONCATENATE(VLOOKUP(LOOKUP(2,1/($A$5:A7<>""""),$A$5:A7),Instructions!$A$4:$B$40,2,0),NTFS!XFC7-2),'Trial Balance'!$I$55:$J$1048576,2,0)" 

注意,值用式置換和<後引號>加倍。

+0

謝謝。有用! –

0
votes
answers
6 views
+10

VBA宏無法正常工作

0

我有一個包含員工數據和Word模板的Excel文件。我將郵件合併並創建了一個宏,它向我詢問員工姓名,並根據姓名從Excel文件中將該員工的員工詳細信息提取到Word文件。VBA宏無法正常工作

如果記錄來自Excel工作表的頂部到底部,宏能夠檢索記錄。但是,任何高於當前檢索記錄的記錄都不會被抓取。這真是一個麻煩。能否請你幫忙?

下面是我的代碼:

Sub getdata() 
Dim numRecord As Integer 
Dim myName As String 
myName = InputBox("Enter Name:") 
Set dsMain = ActiveDocument.MailMerge.DataSource 
If dsMain.FindRecord(FindText:=myName, Field:="Name") = True Then 
numRecord = dsMain.ActiveRecord 
End If 
End Sub 
沙发
0
2

下面是從MailMergeDataSource.FindRecord方法documentation直接引用:

「的FindRecord方法並向前搜索僅因此,如果活動記錄不是數據源中的第一條記錄,而且您正在搜索的記錄位於活動記錄之前,FindRecord方法將不返回任何結果。爲確保搜索整個數據源,請將ActiveRecord屬性設置爲wdFirstRecord。「

此,根據MailMergeDataSource.ActiveRecord物業documentation將是這樣的:

With ActiveDocument.MailMerge 
.DataSource.ActiveRecord = wdFirstRecord 
End With 
+0

太謝謝你了。它爲我工作!非常感謝。 – bishwarup990

+0

不用擔心。請接受作爲答案,如果它的工作。如果有什麼遺漏,讓我們知道,我自己或其他人可能會提供更多的細節。 – QHarr

0
votes
answers
6 views
+10

如何打開保存在特定位置的Excel文件,使用VBA在工作表的最後一個選項卡中創建新選項卡

0

我不是來自軟件背景並試圖編寫宏以避免導致錯誤的重複工作。請隨時提出建議,讓它變得更好。我嘗試從本網站的不同程序中抽取部分內容並使其工作。如何打開保存在特定位置的Excel文件,使用VBA在工作表的最後一個選項卡中創建新選項卡

預先感謝您。

這是我正在做的。 a)我想從當前文件(說文件1)打開保存在特定位置的Excel文件(可以說是文件2)。 作品

b)以文件2相同在該文件中最後一個標籤創建新的選項卡,工程

c)中重新命名使用2個不同的細胞從文件1所創建的標籤(Auto Rename基於文件1單元很好,但我只能管理彈出,要求我輸入但不重命名文件)。 不起作用/部分工作

d)彈出不同的細胞輸入名稱和2個輸入(我只能拿你的名字,我怎麼能得到3輸入3種不同的細胞)隱而不宣't工作/部分工作

e)從文件1中複製2個單元格,並複製到文件2新創建的選項卡中。 不工作

這是我試圖寫的代碼。

Sub Filling_List() 
Dim sPath As String, sFile As String, wb As Workbook, i As Integer 

'Application.ScreenUpdating = False 

sPath = "C:UsersaricsonpDesktopFilling list macro" 
sFile = sPath & "ArF Filling List.xlsm" 

Set wb = Workbooks.Open(sFile) 

ActiveSheet.Copy After:=Worksheets(Worksheets.Count) 
Worksheets(Worksheets.Count).Name = InputBox("New Name:") 
If sName = "" Then Exit Sub 

ActiveSheet.cell(3, "E") = InputBox("Your Name:") 

' With ActiveSheet.Sheets("ArF Filling List (7)") 
'.Range("B03").Value = uploader.Sheets("Que & Tsc Cal").Range("B02").Value 
' .Range("B05").Value = uploader.Sheets("Que & Tsc Cal").Range("B01").Value 
' End With 


'Application.ScreenUpdating = True 


End Sub 
沙发
0
2

這裏有一些指針。

1)Put Option Explicit at top,so syntax and declarations are checked。 這會強制您聲明sNameuploader以及設置它們的值。 i也被聲明但未被分配。

2)您的代碼按原樣重命名爲工作表。您直接從輸入框分配新添加的工作表,而不是將其存儲在變量中。

Worksheets(Worksheets.Count).Name = InputBox("New Name:") 

假設可變sName竟是來保存這些和要抓住在包含代碼(即的ThisWorkbook)正在運行的工作簿從2個細胞這個值:

sName = ThisWorkbook.Worksheets("Sheet1").Range("A1") & ThisWorkbook.Worksheets("Sheet1").Range("B1") 

您可能想要聲明並分配ThisWorkbook以及作爲變量引用的工作表。

例如

Dim wb1 as Workbook 
Dim ws1 as Worksheet 
Set wb1 = ThisWorkbook 
Set ws1 = ThisWorkbook.Worksheets("Sheet1") 'change as appropriate 

3)避免混合工作表集合。除非您有圖表工作表,否則我更喜歡工作表集合。

4)在大多數情況下,您會希望與vbNullstring比較,而不是空字符串文字(「」)。分配速度更快,使用更少的內存等。

If sName = vbNullString Then Exit Sub 

5)將更多值分配給單元格;添加更多輸入框AND使用Cells而非單元例如

ActiveSheet.Cells(4, "E") = InputBox("Your Age:") 

6)將更多單元格的值添加到新打開的工作簿中,新添加的工作表;用你的wbsName變量,以確保正確的定位:

With wb.Worksheets(sName) 

7)您可能要聲明對自己的路線,即避免在一行多個聲明頂部每個變量。使它更易於調試和發現任何隱含的變體。

所以,你可能有類似以下內容:

Option Explicit 

Public Sub Filling_List() 

Dim sPath As String 
Dim sFile As String 
Dim wb As Workbook 
' Dim i As Integer ''not used 
Dim sName As String 'add sName declaration 
'Add declaration for uploader variable and set its value 
Dim wb1 as Workbook 
Dim ws1 as Worksheet 

Set wb1 = ThisWorkbook 
Set ws1 = ThisWorkbook.Worksheets("Sheet1") 

Application.ScreenUpdating = False 

sPath = "C:UsersaricsonpDesktopFilling list macro" 
sFile = sPath & "ArF Filling List.xlsm" 

Set wb = Workbooks.Open(sFile) 

ActiveSheet.Copy After:=Worksheets(Worksheets.Count) 

'Worksheets(Worksheets.Count).Name = InputBox("New Name:") 

sName = ws1.Range("A1") & ws1.Range("B1") 'assign value from two cells 

ActiveSheet.Name = sName 

If sName = vbNullString Then Exit Sub 'compare against vbNullstring not empty string literal 

With wb.Worksheets(sName) 

    .Cells(3, "E") = InputBox("Your Name:") 
    .Cells(4, "E") = InputBox("Your Age:") 
    .Cells(5, "E") = InputBox("Your Occupation:") 
    .Range("B03") = uploader.Worksheets("Que & Tsc Cal").Range("B02").Value2 
    .Range("B05") = uploader.Worksheets("Que & Tsc Cal").Range("B01").Value2 

End With 

Application.ScreenUpdating = True 

End Sub 
+0

謝謝幾乎工作。很好解釋。我使用Option explicit,但它仍然給我錯誤,因爲「編譯錯誤變量未定義,我在最後2行看到代碼停止在Uploader,我們試圖從2個單元中提取值。我嘗試修改wb1而不是上傳器。 – Eric

+0

感謝它的幫助非常豐富,並且很好地解釋了像我這樣一個知識匱乏的人,當我把上傳器改爲wb1時,它的工作方式是我想要的,我看到很多彈出框作爲輸入,有沒有辦法讓我得到1彈出框會詢問我3件事(你的名字?你的年齡?你的職業?),我可以給出3個答案,這將得到3個不同的單元格Say Cell(3,E; 4,E; 5,E) – Eric

+0

是你可以,但你需要額外的代碼來檢查用戶是否已經正確輸入了信息。請參閱這裏的示例:https://social.msdn.microsoft.com/Forums/en-US/52aa7ec1-9663-432c-9449 -55fb1d738969/vba-inputbox-that-returns-array-of-values?forum = isvvba – QHarr

0
votes
answers
6 views
+10

複製圖像從一個表到另一個

0

我已經搜查通過了谷歌和這裏一個合適的回答和我似乎無法找到一個...複製圖像從一個表到另一個

我對「Sheet2的」一個形象,我想要複製到「Sheet1」,圖像的名稱是靜態的,不會更改。我有下面的代碼刪除的「工作表Sheet1」已有的形象,現在我需要用.Select並粘貼到它與「Sheet2的」圖像

Sub CheckImageName() 

    For Each shape In ActiveSheet.Shapes 
     If Not Intersect(shape.TopLeftCell, Range("L77:AM97")) Is Nothing Then 
      shape.Delete 
     End If 
    Next shape 

End Sub 

每一個方法,我看到被替換區域,但我真的試圖避免使用.Select.Paste方法,因爲我已經閱讀了所有的SO和其他來源,最好避免使用.Select

+0

這是你需要使用複製/粘貼 –

+0

雖然最好避免使用'.Select',在某些時候它走的必由之路一個情況下,所以你必須! 「選擇」是有原因的,當絕對必要時選擇「事物」。 –

+0

感謝@ScottHoltzman的快速反應,你可以把這個作爲答案,以便我可以標記它嗎? – Maldred

沙发
0
1

我發現了可以應用於您的問題的Word的響應。

Copy shape in Word 2010 without .Select?

Sub createShape() 
    Set myshape = ActiveDocument.Shapes.AddShape(msoShapeRectangle, 100, 100, 100, 100) 
    Set anothershape = myshape.Duplicate 
End Sub 
0
votes
answers
6 views
+10

如何在VBA中使用VLOOKUP中的變量作爲範圍評估?

1

我不知道我是否解釋得很好。我是一名初學者,我試圖在VBA中使用VLOOKUP從文件中獲取一個值。然而,即使我可以明顯地使用字符串本身,我也不能將它用作變量。如何在VBA中使用VLOOKUP中的變量作爲範圍評估?

因此,當我在下拉列表中選擇某些內容時,其想法是自動填充兩個文本框。 Dropwdown本身決定了包含數據的工作表。

Private Sub cbProductList1_Change() 
    vCode1 = Application.WorksheetFunction.VLookup(cbProductList1.Value, 
    [Products!A:B], 2, False) 
    Me.tbProdCode1 = vCode1 
    vPrice1 = Evaluate("VLOOKUP(" & vCode1 & ", " & Me.labelCFValue & ", 2, False)") 
    Me.tbPrice1 = vPrice1 
End Sub 

如果我在vCode1上運行MsgBox - 它給了我需要成爲VLOOKUP的第一個參數的字符串。 如果我在Me.labelCFValue上運行MsgBox,它會給我CF_1!A25:B33(不帶引號),就像我需要它一樣。但是當我在vPrice1上運行MsgBox時,出現錯誤。

以後編輯:另外,如果你能幫我使用Me.labelCFValue裏面Application.WorksheetFunction.VLookup(),這也可能是好的。

請幫忙?

+1

如果你創建一個用戶定義的函數,你可以返回labelCFvalue的值(例如'Public Function getlabelCF()as string getlabelCF = Me.labelCFValue End Function') – serakfalcon

+0

謝謝!這解決了它! – NsD

沙发
0
1

我無法測試代碼,但相信這應該工作或幫助您找到自己的方式。

Option Explicit 

Private Sub cbProductList1_Change() 

    Dim Rl As Long        ' last row 
    Dim LookupRange As Range 
    Dim Sp() As String       ' splitting labelCFValue 
    Dim vCode1 As String 
    Dim vPrice1 As Double 

    ' ActiveSheet is the default, but better to declare 
    With ActiveSheet 
     Rl = .Cells(.Rows.Count, "A").End(xlUp).Row 
     Set LookupRange = .Range(.Cells(1, 1), Cells(Rl, 2)) 
    End With 
    vCode1 = Application.VLookup(cbProductList1.Value, LookupRange, 2, False) 
    Me.tbProdCode1 = vCode1 

    ' If Me.labelCFValue is a Label, the string should be its Caption property. 
    ' If it is a Textbox the string should be its Value or Text property. 
    ' Either way, it is better to specify what you are addressing:- 
    Sp = Split(Me.labelCFValue, "!") 
    Set LookupRange = Worksheets(Sp(0)).Range(Sp(1)) 
    vPrice1 = Evaluate(Application.VLookup(vCode1, LookupRange, 2, False)) 
    Me.tbPrice1 = vPrice1 
End Sub 

考慮添加一些預防性代碼來處理任一Vlookups返回錯誤的可能性。

0
votes
answers
5 views
+10

錯誤53:文件未找到,而是所有的DLL都存在於路徑中

0

我創建了一個DLL(使用C++),它依賴於sqlite3.dll(用於數據庫訪問& sqlcipher),我試圖使用VBA來訪問它。在VBA我使用以下聲明:錯誤53:文件未找到,而是所有的DLL都存在於路徑中

Declare Function GetData_VBA Lib "xyz.dll" (ByVal path As String, ByVal id As String, ByRef inputArr() As String, ByRef output() As String) As Boolean 

早些時候當DLL是不依賴於sqlite3.dll它工作正常,但是當我介紹sqlite3.dll它開始嘔吐錯誤

錯誤53:xyz.dll沒有找到

我試圖改變聲明

Declare Function GetData_VBA Lib "C:documentsuser...projectsxyz.dll" (ByVal path As String, ByVal id As String, ByRef inputArr() As String, ByRef output() As String) As Boolean 

但仍顯示相同的事情。我用dependency walker來檢查對xyz.dll的所有依賴。我嘗試將所有xyz.dll & sqlite3.dll放在同一位置,但仍然是相同的錯誤。

+0

你的dll是否在C++環境中測試過? –

+0

sqlite3.dll在您的PATH環境變量中的位置,如果不是,則考慮添加它。或者,如果您正在控制其安裝位置,則可以使用特定位置的LoadLibrary手動加載它。 –

+0

您確定您的* .dll *和* sqlite3.dll *之間沒有架構不匹配(32/64位)嗎? – CristiFati

沙发
0
0

cryptlib.lib缺少sqlite3.dll從屬關係。我已經提供了.lib文件,它工作。

0
votes
answers
5 views
+10

MS Access vba保存按鈕錯誤3021

1

由於各種原因,我想在我的表單上設置一個自定義按鈕以保存當前記錄。我使用一個導航表單,並希望在保存條目時觸發相同的過程(完整性檢查,用戶輸入等),從而每當用戶按下「保存」按鈕或切換到另一個表單時。用戶將被有條件地要求確認該過程並因此能夠取消它。MS Access vba保存按鈕錯誤3021

一切都與一個非常奇怪和憤怒異常順利運行:每當我點擊「更新前」事件中節省一個記錄按鈕和提示信息,我收到

RTE 3021( 「沒有當前記錄」)

沒有MsgBox,一切都很好。更奇怪的是: 當我通過使用導航窗體切換到另一個窗體來觸發保存過程(或者只需按下「外部」用於數據輸入的窗體)時,一切都很好。

這裏是一個簡約例子(與DoCmd.Save,重新查詢或acCmdSaveRecord相似的結果):

Private Sub vt_save_Click() 
Me.Dirty = False 
End Sub 

Private Form_BeforeUpdate(Cancel As Integer) 
Cancel = True 
MsgBox "Test" 
End Sub 

任何想法?我根本無法繞過那個錯誤。

+0

什麼是*簡約的例子*應該顯示?可能的錯誤來自'BeforeUpdate'觸發器中調用的* other *代碼(即完整性檢查,用戶輸入),無法在新記錄上運行。請發佈這樣的更完整的代碼。 – Parfait

+0

我從來沒有使用BeforeUpdate事件的形式。我在按鈕Click事件中進行數據驗證。 – June7

+0

@Parfait這個簡約的例子顯示了你所描述的內容。創建一個新的數據庫,一個表格,一個表格。創建一個記錄,輸入數據並按下按鈕。等voilá - 你會得到錯誤。 –

沙发
0
0

最直接和合理的解決方案是使用錯誤處理程序 - 這是我頑固地忽略的。

Private Sub save_Click() 
On Error GoTo Err_Handler 

Me.Dirty = False 
Exit_Here: 
    Exit Sub 

Err_Handler: 
    If Err.Number = 2101 Then 
    'ignore or message 
Else 
    MsgBox Err.Description 
End If 

Resume Exit_Here 

End Sub 
板凳
0
0

你也許可以嘗試在檢查記錄是否存在的同時使用表單中的值運行查詢。

桌子上是否有主鍵?如果是這樣,主鍵將成爲您的焦點。

Private Sub vt_Save_Click() 
dim rst  as DAO>Recordset 
Dim strSQL  as String 
Dim strID  as string 

strID = me.YourPrimaryKeyField 

strSQL = "SELECT * " & _ 
     "FROM YourTableName " & _ 
     "WHERE (((YourTableName.YourFieldName) =" & me.PrimaryKeyField & "));" 

set rst = currentdb.openrecordset(strsql) 
if rst.recordcount = 0 then 
    currentdb.execute "INSERT INTO YourTableName (List All Fields to Add) " & _ 
         "SELECT List All Field controls with values to add;" 
End IF 

'Anything else you want the code to do from here 

EndCode: 
If not rst is nothing then 
    rst.close 
    set rst = nothing 
End IF 
End Sub 

對Form_LostFocus()事件重複此過程。如果您想使它更容易,請將此代碼作爲模塊並在窗體上的兩個事件觸發器中調用。

如果這不起作用,請讓我知道,我會很樂意進一步協助。

0
votes
answers
5 views
+10

VBA司

2

似乎是不可思議,這是不是已經有一個答案的問題的重複,但我無法找到問題或答案所以在這裏我去...VBA司

在VBA,在即時窗口,如果我輸入:

?8/7 我得到的結果是: 1.14285714285714這要是我再乘以7給我一個數字,比8略顯不足,即7.99999999999998我的袖珍計算器提供更多小數位,所以它比VBA更好?對? ;-)

但是,如果我添加0.000000000000003的結果1.142...之前,我乘我得到8(其中,順便說一句,也是不正確的);但我的問題是:

我怎樣才能控制答案的精確度相對於爲?8/7顯示的小數位數的號碼嗎?

我已經看到這個答案與accuracy of floating points有關,但它是一個不同的問題,它解釋了不準確的原因,而我有興趣獲得一些額外的數字。

爲此我試圖寫一個返回雙重功能,但它不會返回足夠的小數位...例如我希望看到:1.142857142857142857。我還發現引用了一個decimal數據類型,但我認爲這篇文章是針對VB6(而不是VBA)的,因爲我已經用盡了VBA中的可用數據類型......我錯過了什麼?

Function test() As Double 

    Dim a As Double 
    Dim b As Double 
    Dim c As Double 

    a = 8 
    b = 7 
    c = a/b 
    test = c 

End Function 
+1

的[?爲什麼是浮點數不準確(可能的複製https://stackoverflow.com/questions/21895756/why - 浮點數 - 不準確) –

+0

有'Variant'的'Decimal'子類型。 –

+1

見[SO:比較在VBA精度問題雙(https://stackoverflow.com/questions/235409/compare-double-in-vba-precision-problem)和[比較浮點數,2012版(HTTPS: //randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/)和[Wikipedia:Microsoft Excel中的數字精確度](https://en.wikipedia。org/wiki/Numeric_precision_in_Microsoft_Excel)...我很好奇你在做什麼,15個精度點是不夠的? – ashleedawg

沙发
0
3

圖形和科學計算器不是爲了速度而構建的。他們可以使用軟件實現十進制浮點數來進行計算,而不是IEEE雙打。所以你的袖珍計算器很可能比VBA具有更高的精度,但是需要付出代價。他們所做的事情可能會比一個數量級慢一點。

VBA缺乏內置任意精度浮點庫,但其decimal type支持增加了一倍更高的精度。不幸的是,它不是一個完整的數據類型,而是一個Variant的子類型。要創建它們,你需要使用CDec()

Sub test() 
    Dim x As Variant 
    x = CDec(8)/7 
    Debug.Print x 
End Sub 

這顯示1.1428571428571428571428571429

使用Decimal,你需要知道的事實,如果你不小心,就可以彈出回例如一個Double取決於你如何使用它們:

Sub test2() 
    Dim x As Variant 
    x = CDec(x) 
    Debug.Print TypeName(x) 
    x = 8/7 
    Debug.Print x 
    Debug.Print TypeName(x) 
End Sub 

輸出:

Decimal 
1.14285714285714 
Double 
+0

謝謝你 - 我不知道亞型,抽出時間來解釋的東西,你做的方式十分讚賞。這一切都有道理,歡呼 – SlowLearner