none
Педача нескольких значений из Excel колонки в textbox of PrimalForm RRS feed

Ответы

  • Имеем:

    Скрипт:

    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Template.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row
    	$val = $ws.Cells.Item($row,$col)
    	
    	$result += [pscustomobject]@{
    		Invoices = $_.Value2
    		Values = $val.Value2
    	}
    }
    	
    $result | Where {!$_.Values} | Foreach {$_.Invoices}
    
    $ex.Quit()

    Вывод:

    1815
    2014
    18013
    22018
    16014
    15255

    Правильный вывод? Если нет? Укажите,где  ошибка.

    • Помечено в качестве ответа nesher13 17 июля 2014 г. 11:23
    17 июля 2014 г. 10:02
    Отвечающий

Все ответы

  • 1) Приведите пример Excel файла

    2) Как должно выглядеть на форме?

    Отвечающий
  • я решил все делать в Excel. теперь задача выглядит так:

    проверить, что ячейка в колонке Invoices - не последняя

    проверить для каждой ячейки в колонке Invoices есть ли в соответствующей ячейке

    колонки Values ненулевое значение ( not NULL ? ) , и  занести а массив номер Invoice с нулевым значением и затем  распечатать  этот массив

  • Выводим массив с адресом, где для колонки Invoices , отсутствует Value.

    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\files\test.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row+1
    	$val = $ws.Cells.Item($row,$col)
    	if(!$val.Value2) {
    		$result += [pscustomobject]@{
    			Invoices = $_.Value2
    			Column = $val.Address()
    		}
    	}
    }
    	
    $result | Format-Table -Auto
    
    $ex.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) 
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)  
    Remove-Variable ex
    Remove-Variable wb
    Remove-Variable ws

    Вывод:

    Invoices Column
    -------- ------
        1835 $H$4
        1925 $H$6
        2014 $H$7
       18013 $H$8
       22018 $H$9
       25017 $H$12
       15255 $H$13

    Отвечающий
  • Kazun,

    Во первых, большое спасибо за быстрое реагирование.

    Во вторых, или я объяснил  неточно задачу или Вы не поняли меня.

                       "занести а массив номер Invoice с нулевым значением и затем  распечатать  этот массив"

    В результате появились как Invoices с пустыми значениями, так и Invoices имеющие значения.

  • Изменить часть кода на:

    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row+1
    	$val = $ws.Cells.Item($row,$col).Value2
    	$result += [pscustomobject]@{
    		Invoices = $_.Value2
    		Values = $val
    	}
    }

    Вывод:

    Invoices Values
    -------- ------
        1835
        1815 13,49.27
        1925
        2014
       18013
       22018
       16014 88.365.6
       31208 25,13.53
       25017
       15255

    Отвечающий
  • так мой скрипт выглядит сейчас

    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 0

    $wb =$ex.Workbooks.Open("C:\users\user1\Documents\Template.xls")
    $ws = $wb.Worksheets.Item(1)

    $result = @()

    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
        $col = $_.Column+1   #знак + помечен красным -ошибка где-то
        $row = $_.Row+1
        $val = $ws.Cells.Item($row,$col).Value2
        $result += [pscustomobject]@{
            Invoices = $_.Value2
            Values = $val
        }
    }

    $result | Format-Table -Auto

    $ex.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)  
    Remove-Variable ex
    Remove-Variable wb
    Remove-Variable ws

    -----------------------------------------------------------------------------------------------------------------------------

    вывод:

    Exception calling "Open" with "1" argument(s): "Sorry, we couldn't find C:\users\dov143\Documen
    ts\Template.xls. Is it possible it was moved, renamed or deleted?"
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:4 char:1
    + $wb =$ex.Workbooks.Open("C:\users\dov143\Documents\Template.xls")
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : ComMethodTargetInvocation
     
    You cannot call a method on a null-valued expression.
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:5 char:1
    + $ws = $wb.Worksheets.Item(1)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    You cannot call a method on a null-valued expression.
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:9 char:1
    + [int]$rmax = $ws.Range("G65536").End(-4162).Row
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    You cannot call a method on a null-valued expression.
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:10 char:1
    + $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvokeMethodOnNull
     
    0
    Exception calling "ReleaseComObject" with "1" argument(s): "Object reference not set to an inst
    ance of an object."
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:24 char:1
    + [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : NullReferenceException
     
    Exception calling "ReleaseComObject" with "1" argument(s): "Object reference not set to an inst
    ance of an object."
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:25 char:1
    + [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
        + FullyQualifiedErrorId : NullReferenceException
     
    Remove-Variable : Cannot find a variable with the name 'wb'.
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:27 char:1
    + Remove-Variable wb
    + ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (wb:String) [Remove-Variable], ItemNotFoundExcep
       tion
        + FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.RemoveVariableCom
       mand
     
    Remove-Variable : Cannot find a variable with the name 'ws'.
    At C:\PowerShell\Powershell_Bor\Scripts\Kazun-Invoices-v2.ps1:28 char:1
    + Remove-Variable ws
    + ~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : ObjectNotFound: (ws:String) [Remove-Variable], ItemNotFoundExcep
       tion
        + FullyQualifiedErrorId : VariableNotFound,Microsoft.PowerShell.Commands.RemoveVariableCom
       mand
     

    9 июля 2014 г. 13:31
  • В чем сложность указать правильный путь к файлу?

    Exception calling "Open" with "1" argument(s): "Sorry, we couldn't find C:\users\dov143\Documen
    ts\Template.xls. Is it possible it was moved, renamed or deleted?"

    10 июля 2014 г. 4:11
    Отвечающий
  • Kazun

    В том то все и дело что я могу открыть этот файл через dialog Open, более того я пытался присвоить Path

    сначала переменной, а потом уже использовать эту переменную. Результат тот же.  При отладке переменная Path

    принимает правильное значение, в тоже время переменная $wb  не  находится в списке переменных

    10 июля 2014 г. 6:13
  • Покажите вывод : Get-ChildItem "C:\users\dov143\Documents\Template*"

    10 июля 2014 г. 6:24
    Отвечающий
  • Kazun

    : впереди не надо указывать.
    10 июля 2014 г. 6:35
    Отвечающий
  • Почему так сложно правильно скопировать команду? - С завершающей двойной кавычкой в конце, с использованием *.

    Почему пишете Template.xlsx,а в пути указываете C:\users\dov143\Documents\Template.xls с неправильным расширением?

    Get-ChildItem "C:\users\dov143\Documents\Template*"

    10 июля 2014 г. 6:44
    Отвечающий
  • В скрипте путь к файлу должен быть  C:\users\dov143\Documents\Template.xlsx
    10 июля 2014 г. 6:55
    Отвечающий
  • Я очень извеняюсь за описку в имени файла (.xls вместо xlsx).

    Вывод скрипта следующий:

    вместо правильного:

    1815

    2014

    18013

    22018

    16014

    15255

    10 июля 2014 г. 7:20
  • Так а где описанная логика в вашей задачи? Почему ,скажем, пропускаем 31208 и 25017?
    10 июля 2014 г. 7:30
    Отвечающий
  • Kazun,

    "Во первых, большое спасибо за быстрое реагирование.

    Во вторых, или я объяснил  неточно задачу или Вы не поняли меня.

                       "занести а массив номер Invoice с нулевым значением и затем  распечатать  этот массив"

    В результате появились как Invoices с пустыми значениями, так и Invoices имеющие значения.

    10 июля 2014 г. 7:37
  • Заменить строку:

    $result | Format-Table -Auto

    на

    $result.Invoices

    10 июля 2014 г. 8:11
    Отвечающий
  • это, к сожалению,тоже не дает правильный результат.

    Он выводит подряд как Invoices co значением,так и без него,

    а нужно только без значения.

    10 июля 2014 г. 8:28
  • это, к сожалению,тоже не дает правильный результат.

    Он выводит подряд как Invoices co значением,так и без него,

    а нужно только без значения.

    $result | Where {!$_.Values} | Foreach {$_.Invoices}

    10 июля 2014 г. 8:36
    Отвечающий
  • это, к сожалению,тоже не дает правильный результат.

    сначала выводятся какие то свойства

    Application                      : Microsoft.Office.Interop.Excel.Applicatio
                                       nClass
    Creator                          : 1480803660
    Parent                           : Microsoft.Office.Interop.Excel.Applicatio
                                       nClass
    AcceptLabelsInFormulas           : False
    ActiveChart                      :
    ActiveSheet                      : System.__ComObject
    Author                           : Dov
    AutoUpdateFrequency              : 0
    AutoUpdateSaveChanges            :
    ChangeHistoryDuration            : 0
    BuiltinDocumentProperties        : System.__ComObject
    Charts                           : System.__ComObject
    CodeName                         :
    _CodeName                        :
    CommandBars                      :
    Comments                         :
    ConflictResolution               : 1
    Container                        :
    CreateBackup                     : False
    CustomDocumentProperties         : System.__ComObject
    Date1904                         : False
    DialogSheets                     : System.__ComObject
    DisplayDrawingObjects            : -4104
    FileFormat                       : 51
    FullName                         : C:\users\dov143\Documents\Template.xlsx
    HasMailer                        : False
    HasPassword                      : False
    HasRoutingSlip                   : False
    IsAddin                          : False
    Keywords                         :
    Mailer                           :
    Modules                          : System.__ComObject
    MultiUserEditing                 : False
    Name                             : Template.xlsx
    Names                            : System.__ComObject
    OnSave                           :
    OnSheetActivate                  :
    OnSheetDeactivate                :
    Path                             : C:\users\dov143\Documents
    PersonalViewListSettings         : True
    PersonalViewPrintSettings        : True
    PrecisionAsDisplayed             : False
    ProtectStructure                 : False
    ProtectWindows                   : False
    ReadOnly                         : False
    _ReadOnlyRecommended             : False
    RevisionNumber                   : 0
    Routed                           : False
    RoutingSlip                      : System.__ComObject
    Saved                            : True
    SaveLinkValues                   : True
    Sheets                           : System.__ComObject
    ShowConflictHistory              : False
    Styles                           : System.__ComObject
    Subject                          :
    Title                            :
    UpdateRemoteReferences           : True
    UserControl                      :
    UserStatus                       : {Dov, 10/07/2014 11:39, 1}
    CustomViews                      : System.__ComObject
    Windows                          : System.__ComObject
    Worksheets                       : System.__ComObject
    WriteReserved                    : False
    WriteReservedBy                  : Dov
    Excel4IntlMacroSheets            : System.__ComObject
    Excel4MacroSheets                : System.__ComObject
    TemplateRemoveExtData            : False
    HighlightChangesOnScreen         : False
    KeepChangeHistory                : True
    ListChangesOnNewSheet            : False
    VBProject                        :
    IsInplace                        : False
    PublishObjects                   : System.__ComObject
    WebOptions                       : System.__ComObject
    HTMLProject                      :
    EnvelopeVisible                  : False
    CalculationVersion               : 152511
    VBASigned                        : False
    ShowPivotTableFieldList          : True
    UpdateLinks                      : 1
    EnableAutoRecover                : True
    RemovePersonalInformation        : False
    FullNameURLEncoded               : C:\users\dov143\Documents\Template.xlsx
    Password                         : ********
    WritePassword                    : ********
    PasswordEncryptionProvider       :
    PasswordEncryptionAlgorithm      :
    PasswordEncryptionKeyLength      : 0
    PasswordEncryptionFileProperties : True
    ReadOnlyRecommended              : False
    SmartTagOptions                  :
    Permission                       : System.__ComObject
    SharedWorkspace                  :
    Sync                             : System.__ComObject
    XmlNamespaces                    : System.__ComObject
    XmlMaps                          : System.__ComObject
    SmartDocument                    : System.__ComObject
    DocumentLibraryVersions          :
    InactiveListBorderVisible        : True
    DisplayInkComments               : True
    ContentTypeProperties            :
    Connections                      : System.__ComObject
    Signatures                       : System.__ComObject
    ServerPolicy                     :
    DocumentInspectors               : System.__ComObject
    ServerViewableItems              : System.__ComObject
    TableStyles                      : System.__ComObject
    DefaultTableStyle                : System.__ComObject
    DefaultPivotTableStyle           : System.__ComObject
    CheckCompatibility               : False
    HasVBProject                     : False
    CustomXMLParts                   : System.__ComObject
    Final                            : False
    Research                         : System.__ComObject
    Theme                            : System.__ComObject
    Excel8CompatibilityMode          : False
    ConnectionsDisabled              : False
    ShowPivotChartActiveFields       : False
    IconSets                         : System.__ComObject
    EncryptionProvider               :
    DoNotPromptForConvert            : False
    ForceFullCalculation             : False
    SlicerCaches                     : System.__ComObject
    ActiveSlicer                     :
    DefaultSlicerStyle               : System.__ComObject
    AccuracyVersion                  : 0
    CaseSensitive                    : False
    UseWholeCellCriteria             : True
    UseWildcards                     : True
    PivotTables                      : System.__ComObject
    Model                            : System.__ComObject
    ChartDataPointTrack              : True
    DefaultTimelineStyle             : System.__ComObject

    а потом

    1835
    1925
    2014
    18013
    22018
    25017
    15255
    2
    0
    1

    1835
    1925
    2014
    18013
    22018
    25017
    15255
    2
    0
    1

    10 июля 2014 г. 8:48
  • $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 0
    $wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Template.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row+1
    	$val = $ws.Cells.Item($row,$col)
    	if(!$val.Value2) {
    		$result += [pscustomobject]@{
    			Invoices = $_.Value2
    			Column = $val.Address()
    		}
    	}
    }
    	
    $result | Where {!$_.Values} | Foreach {$_.Invoices}
    
    $ex.Quit()
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) | Out-Null 
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) | Out-Null
    [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws) | Out-Null 
    Remove-Variable ex
    Remove-Variable wb
    Remove-Variable ws

    Вывод:

    1835
    1925
    2014
    18013
    22018
    25017
    15255

    10 июля 2014 г. 8:53
    Отвечающий
  • Kazun,

    результат не правильный.

    давайте на некоторое приостановим нашу дискуссию.

    я попробую установить виртуальную машину с win 7 и office 2010.

    сейчас я использую win 8.1 и  office 2013. как только я получу какой нибудь результат ,

    сразу же отпишусь

    10 июля 2014 г. 12:42
  • kazun,

    я очень ценю вашу помощь и время потраченное на решение моей проблемы и извиняюсь за длительное молчание. проверка на win7 и office 2010 дала те же результаты.

    я уже не знаю в каком направлении двигаться

    17 июля 2014 г. 9:19
  • Имеем:

    Скрипт:

    $ex = New-Object -ComObject Excel.Application
    $ex.Visible = 1
    $wb = $ex.Workbooks.Open("C:\users\dov143\Documents\Template.xlsx")
    $ws = $wb.Worksheets.Item(1)
    
    $result = @()
    
    [int]$rmax = $ws.Range("G65536").End(-4162).Row
    $ws.Range("G3:G$rmax") | Where {$_.Value2} | Foreach {
    	$col = $_.Column+1
    	$row = $_.Row
    	$val = $ws.Cells.Item($row,$col)
    	
    	$result += [pscustomobject]@{
    		Invoices = $_.Value2
    		Values = $val.Value2
    	}
    }
    	
    $result | Where {!$_.Values} | Foreach {$_.Invoices}
    
    $ex.Quit()

    Вывод:

    1815
    2014
    18013
    22018
    16014
    15255

    Правильный вывод? Если нет? Укажите,где  ошибка.

    • Помечено в качестве ответа nesher13 17 июля 2014 г. 11:23
    17 июля 2014 г. 10:02
    Отвечающий
  • Kazun,

    Все работает отлично. Огромное Вам спасибо.

    17 июля 2014 г. 11:22