Si sólo metes un valor en la lista, el primer condicional se ejecuta y se incremente el valor de x de manera que al llegar al segundo condicional x = 1 y no habiendo más que el elemento 0 en la lista te produce el error por intentar acceder a listbox3.Items[1].
Si metes dos valores no te falla porque listbox3 tiene los elmentos 0 y 1.
También te va a fallar si no hay ningún elemento en la lista. En este caso fallará dese el primer condicional al intentar acceder a listbox3[0] ya que no existe item coníndice 0.
No sé bien qué intentas hacer pero da la impresión de que requieres un bucle:
Código Delphi
[-]
for x := 0 to listbox3.Count - 1 do
begin
table4.Insert;
table4.FieldByname('Exp1').AsString:=listbox3.Items[x];
table4.Post;
end;
De esta forma, además de que abarcas cualquier número de elementos en la lista, te aseguras que dentro del bucle x sólo pueda ser un índice válido de listbox3. En el caso de que la lista esté vacía, ni siquierea se entrará al bucle.
// Saludos