Функция СИ с vb.net - PullRequest
       36

Функция СИ с vb.net

1 голос
/ 30 октября 2019

Я пишу программу, которая автоматически генерирует предварительно заполненный файл Excel для моей компании. Все работает нормально, за исключением строки, в которой я хотел бы написать следующую функцию: = SI (F15 = ""; ""; G15-G15-0,5)

Я попробовал два решения:

сначала, вот это:

Private Const quote As String = Chr(34)

'Code working fine

With .Range("H15")
   .Characters.Font.Size = 10
   .HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
   .Formula = "=SI(F15=" & quote & quote & ";" & quote & quote & ";G15-F15-0,5)"
End With

, которое возвращает мне следующее исключение:

L'exception System.Runtime.InteropServices.COMException n'a pas été gérée
  ErrorCode=-2146827284
  HResult=-2146827284
  Message=Exception de HRESULT : 0x800A03EC
  Source=""
  StackTrace:
       à System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
       à Microsoft.Office.Interop.Excel.Range.set_Formula(Object )
       à AutoFHT.DocumentFHT..ctor() dans C:\Users\BOUCKB\documents\visual studio 2015\Projects\AutoFHT\AutoFHT\DocumentFHT.vb:ligne 295
       à AutoFHT.MainWindow.BT_Test_Click(Object sender, RoutedEventArgs e) dans C:\Users\BOUCKB\documents\visual studio 2015\Projects\AutoFHT\AutoFHT\MainWindow.xaml.vb:ligne 5
       à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       à System.Windows.UIElement.RaiseEvent(RoutedEventArgs e)
       à System.Windows.Controls.Primitives.ButtonBase.OnClick()
       à System.Windows.Controls.Button.OnClick()
       à System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
       à System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e)
       à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       à System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
       à System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e)
       à System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
       à System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
       à System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
       à System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
       à System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
       à System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
       à System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
       à System.Windows.Input.InputManager.ProcessStagingArea()
       à System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
       à System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
       à System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
       à System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       à System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       à MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       à MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       à System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       à System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
       à System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
       à MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       à MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       à System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       à System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       à System.Windows.Application.RunDispatcher(Object ignore)
       à System.Windows.Application.RunInternal(Window window)
       à System.Windows.Application.Run(Window window)
       à System.Windows.Application.Run()
       à AutoFHT.Application.Main()
       à System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       à System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       à System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Затем я попробовал это, которое вместо этого устанавливает формулу с пробеломиз равных, а затем заменяет пространство с равными:

Private Const quote As String = Chr(34)
Private Const egal As String = Chr(61)

'Code working fine

With .Range("H15")
   .Characters.Font.Size = 10
   .HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
   .Formula = " SI(F15=" & quote & quote & ";" & quote & quote & ";G15-F15-0,5)"
   .Characters(0, 1).text = egal
End With

Это почти работает, но когда я открываю файл Excel, формулы отображаются в виде текста в ячейках, и не выполняютсяв качестве формул, если я не нажму F2, а затем введите в ячейку.

Я пытался использовать это в конце на с:

.Select
Forms.SendKeys.Send("{F2}")
Forms.SendKeys.Send("{ENTER}")

, но, поскольку Excel работает в фоновом режиме, он не 'т работа.

Кто-нибудь может помочь мне решить эту проблему и получить полностью рабочий лист?

Заранее спасибо

1 Ответ

1 голос
/ 30 октября 2019

Согласно моему комментарию, проблема в том, что VB основан на en_US, поэтому независимо от локали вы должны написать формулы en_US, то есть вы должны ввести:

=IF(F15="","",G15-G15-0.5)

В коде:

.Formula = "=IF(F15=" & quote & quote & "," & quote & quote & ",G15-F15-0.5)"

Обратите внимание на запятую вместо точки с запятой и точку вместо запятой. Вывод будет автоматически переведен на ваш язык.

...