Доступ VBA: действительно ли возможно сбросить обработку ошибок

Метки TextFields обычно заполняются свойством source. Если вы хотите использовать компонент <ShowController> с пользовательским макетом, я предлагаю вам создать другой пользовательский компонент и использовать его внутри <Show>, <ShowView> или <SimpleShowLayout>.

Я обернул поля компонентом SimpleForm, чтобы можно было показывать их метки и скрывать панель инструментов с пользовательскими CardActions.

Пример:

const FormToolbar = () => (
 <CardActions style={{display: 'none'}}>
 </CardActions>
);

const FormDiv = ({controllerProps, ...props}) => (
 <Grid container spacing={24}>
   <Grid item xs={12}>
     <SimpleForm toolbar={<FormToolbar/>}>
      <TextField {...props} record={controllerProps.record} source="name"/>
     </SimpleForm>
 </Grid>
</Grid>
);

const OrderShow = props => (
 <ShowController {...props} title="Order">
    {controllerProps =>
        <Show actions={<ShowActions pageType="show" />} {...props} {...controllerProps}>
            <SimpleShowLayout>
                <FormDiv controllerProps={controllerProps} />
            </SimpleShowLayout>
        </Show>
    }
</ShowController>
);

export default OrderShow;
12
задан Brian Leeming 2 March 2016 в 15:25
поделиться

4 ответа

Почти всегда лучше избежать ошибок, вместо того, чтобы обработать их. Например:

Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True

'On Error GoTo Openwb '
'wbExists = False '

If Dir("C:\REPORT3.xls") = "" Then
    objexcel.Workbooks.Add
    Set wbexcel = objexcel.ActiveWorkbook
    Set objSht = wbexcel.Worksheets("Sheet1")
Else
    Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
    Set objSht = wbexcel.Worksheets("Sheet1")
End If

objSht.Activate
'wbExists = True '
5
ответ дан 2 December 2019 в 06:46
поделиться

On error goto 0 дайте руку Visual Basic для ошибочной обработки (в общем окне сообщения)

On error goto label перенаправит Ваш код для маркировки:

On error resume next проигнорирует ошибку и продолжится

Resume next перенаправьте код к следующей строке после того, как ошибка будет повышена

это означает что комбинации инструкций такой как

On Error goto 0
...
On Error goto 0

не имейте смысла

И если Вы хотите перенаправить "на ошибке", инструкция необходимо будет сделать это этот путь:

Do While Not rs.EOF

    On Error Resume Next
    rs2.Open strsql
    On error Goto 0

    rs2.moveNext

Loop

Если Вы хотите перенаправить ошибку к маркировке (для обработки или безотносительно) и затем вернуться к коду, где ошибка произошла, необходимо записать что-то как:

On error goto label
...
...
On error goto 0
exit sub (or function)

label:
....
resume next
end function

Но я действительно советую Вам быть более строгими на Вашем управлении обработкой ошибок. Необходимо сначала смочь сделать что-то как этот:

Set objexcel = CreateObject("excel.Application")
objexcel.Visible = True

On Error GoTo error_Treatment
wbExists = False
Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate
wbExists = True
On error GoTo 0

Set db = DBEngine.opendatabase("C:\book.mdb")
Set rs = db.OpenRecordset("records")

Set rs2 = CreateObject("ADODB.Recordset")
rs2.ActiveConnection = CurrentProject.Connection

For Each tdf In CurrentDb.TableDefs
    ....
    'there are a number of potential errors here in your code'
    'you should make sure that rs2 is closed before reopening it with a new instruction'
    'etc.'
Next tdf

Exit sub

error_treatment:
SELECT Case err.number
   Case **** '(the err.number raised when the file is not found)'
       objexcel.Workbooks.Add
       Set wbexcel = objexcel.ActiveWorkbook
       Set objSht = wbexcel.Worksheets("Sheet1")
       Resume next 'go back to the code'
   Case **** '(the recordset cannot be opened)'
       ....
       ....
       Resume next 'go back to the code'
   Case **** '(whatever other error to treat)'
       ....
       ....
       Resume next 'go back to the code'
   Case Else
       debug.print err.number, err.description '(check if .description is a property of the error object)'
       'your error will be displayed in the immediate windows of VBA.' 
       'You can understand it and correct your code until it runs'
End select
End sub

Следующий шаг должен будет ожидать ошибки в Вашем коде так, чтобы допускать ошибку объект не был повышен. Можно, например, записать родовую функцию как этот:

Public function fileExists (myFileName) as Boolean

Можно затем использовать в своих интересах эту функцию в коде путем тестирования существования xls файла:

if fileExists("C:\REPORT3.xls") Then
    Set wbexcel = objexcel.Workbooks.Open("C:\REPORT3.xls")
Else
   objexcel.Workbooks.Add
   Set wbexcel = objexcel.ActiveWorkbook
Endif        
Set objSht = wbexcel.Worksheets("Sheet1")
objSht.Activate

Вам больше не нужна Ваша wbExist переменная...

Таким же образом необходимо ожидать случай, где recordset не имеет никаких записей. Запись RS. MoveFirst прежде, чем протестировать его мог повысить ошибку. Необходимо затем записать

If rs.EOF and rs.BOF then
Else
    rs.moveFirst
    Do while not rs.EOF
         rs.moveNext
    Loop
Endif
12
ответ дан 2 December 2019 в 06:46
поделиться

попробовать

On Error Goto 0

Поскольку дальнейшая справка смотрит здесь: http://msdn.microsoft.com/en-us/library/bb258159.aspx

1
ответ дан 2 December 2019 в 06:46
поделиться

Необходимо очистить ошибку. Попытайтесь вставить этот код:

If Err.Number > 0 Then
    Err.Clear
End If

Можно также использовать Err. Число для обработки определенных ошибочных случаев.

4
ответ дан 2 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: